91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

動(dòng)態(tài)規(guī)劃:8行代碼搞定最大子數(shù)組和問題

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2022-04-01 10:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

鐵子們,我是小風(fēng)哥,你也可以叫我島主

今天給大家?guī)硪坏罉O其經(jīng)典的題目,叫做最大和子數(shù)組,給定一個(gè)數(shù)組,找到其中的一個(gè)連續(xù)子數(shù)組,其和最大。

示例:

輸入:nums=[-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:子數(shù)組[4,-1,2,1]的和為6,其它任何連續(xù)的子數(shù)組和不超過6.

想一想該怎樣解決這個(gè)問題。

如果你一時(shí)想不到解法可以從暴利解法開始。

暴力求解

這種解法最簡(jiǎn)單,我們把所有子數(shù)組找出來,然后依次計(jì)算其和,找出一個(gè)最大的出來,比如給定數(shù)組[1,2,3],那么我們能找出子數(shù)組:[1],[2],[3],[1,2],[2,3],[1,2,3],很顯然這里和最大的子數(shù)組為[1,2,3],其值為6。

intsum(vector&nums,intb,inte){
intres=0;
for(;b<=?e;?b++)?{
????????res?+=?nums[b];
????}
????returnres;
}
intmaxSubArray(vector&nums){
intsize=nums.size();
intres=0x80000000;
for(inti=0;ifor(intj=i;jreturnres;
}

這種解法最簡(jiǎn)單,該算法的時(shí)間復(fù)雜度為O(n^3),其中找出所有子數(shù)組的時(shí)間復(fù)雜度為O(n^2),計(jì)算每個(gè)子數(shù)組的和的時(shí)間復(fù)雜度為O(n),因此其時(shí)間復(fù)雜度為O(n^3)。

讓我們?cè)賮砜匆幌逻@個(gè)過程,這里的問題在于計(jì)算每個(gè)子數(shù)組的和時(shí)有很多重復(fù)計(jì)算,比如我們知道了子數(shù)組[1,2]的和后再計(jì)算數(shù)組[1,2,3]的值時(shí)完全可以利用子數(shù)組[1,2]的計(jì)算結(jié)果而無需從頭到尾再算一遍,也就是說我們可以利用上一步的計(jì)算結(jié)果,這本身就是動(dòng)態(tài)規(guī)劃的思想。

8589ba58-b15c-11ec-aa7f-dac502259ad0.png

基于該思想我們可以對(duì)上述代碼簡(jiǎn)單改造一下:

intmaxSubArray(vector&nums){
intsize=nums.size();
intres=0x80000000;
for(inti=0;ifor(intj=i+1;jreturnres;
}

看到了吧,代碼不但更簡(jiǎn)潔,而且運(yùn)行速度更快,該算法的時(shí)間復(fù)雜度為O(n^2),比第一種解法高了很多。

還有沒有進(jìn)一步提高的空間呢?

答案是肯定的。

分而治之

我們?cè)谥暗奈恼轮姓f過,分治也是一種非常強(qiáng)大的思想,具體應(yīng)該這里的話我們可以把整個(gè)數(shù)組一分為二,然后子數(shù)組也一分為二,不斷劃分下去就像這樣:

859b978c-b15c-11ec-aa7f-dac502259ad0.png

然后呢?

然后問題才真正開始有趣起來,注意,當(dāng)我們劃分到最下層的時(shí)候,也就是不可再劃分時(shí)會(huì)得到兩個(gè)數(shù)組元素,比如對(duì)于數(shù)組[1,2]會(huì)劃分出[1]與[2],此時(shí)[1]與[2]不可再劃分,那么對(duì)于子問題[1,2],其最大子數(shù)組的和為max(1+2, 1,2),也就是說要么是左半部分的元素值、要么是右半部分的元素值、要么是兩個(gè)元素的和,就這樣我們得到了最后兩層的答案:

85bb2606-b15c-11ec-aa7f-dac502259ad0.png

假設(shè)對(duì)于數(shù)組[1,2,3,4],一次劃分后得到了[1,2]與[3,4],用上面的方法我們可以分別知道這兩個(gè)問題的最大子數(shù)組和,我們?cè)鯓永蒙鲜龅拇鸢竵斫鉀Q更大的問題,也就是[1,2,3,4]呢?

很顯然,對(duì)于[1,2,3,4]來說,最大子數(shù)組的和要么來自左半部分、要么來自右半部分、要么來自中間部分——也就是包含2和3,其中左半部分和右半部分的答案我們有了,那么中間部分的最大和該是多少呢?

其實(shí)這個(gè)問題很簡(jiǎn)單,我們從中間開始往兩邊不斷累加,然后記下這個(gè)過程的最大值,比如對(duì)于[1,-2,3,-4,5],我們從中間的3開始先往左邊累加和是:{1+(-2)+3, (-2)+3, 3}也就是{2,1,3},因此我們以中間數(shù)字為結(jié)尾的最大子數(shù)組和為3:

85ce2bde-b15c-11ec-aa7f-dac502259ad0.png

另一邊也是同樣的道理,只不過這次是以中間數(shù)字為起點(diǎn)向右累加:

85e0d090-b15c-11ec-aa7f-dac502259ad0.png

然后這三種情況中取一個(gè)最大值即可,這樣我們就基于子問題解決了更大的問題:

85f977a8-b15c-11ec-aa7f-dac502259ad0.png

此后的道理一樣,最終我們得到了整個(gè)問題的解。

根據(jù)上面的分析就可以寫代碼了:

intgetMaxSum(vector&nums,intb,inte){
if(b==e)returnnums[b];
if(b==e-1)returnmax(nums[b],max(nums[e],nums[b]+nums[e]));
intm=(b+e)/2;
intmaxleft=nums[m];
intmaxright=nums[m];
intsum=nums[m];

for(inti=m+1;i<=?e;?i++)?{
????????sum?+=?nums[i];
????????maxright?=?max(maxright,?sum);
????}

????sum?=?nums[m];
????for(inti=m-1;i>=b;i--){
sum+=nums[i];
maxleft=max(maxleft,sum);
}
returnmax(getMaxSum(nums,b,m-1),max(getMaxSum(nums,m+1,e),maxleft+maxright-nums[m]));
}
intmaxSubArray(vector&nums){
returngetMaxSum(nums,0,nums.size()-1);
}

上述這段代碼的時(shí)間復(fù)雜度為O(NlogN)比第二種方法又提高了很多。

動(dòng)態(tài)規(guī)劃

實(shí)際上這個(gè)問題還有另一種更妙的解決方法,我們令dp(i)表示以元素A[i]為結(jié)尾的最大子數(shù)組的和,那么根據(jù)這一定義則有:

860dadd6-b15c-11ec-aa7f-dac502259ad0.png

這是很顯然的,注意dp(i)的定義,是以元素A[i]為結(jié)尾的最大子數(shù)組的和,因此dp(i)的值要么就是A[i]連接上之前的一個(gè)子數(shù)組,那么不鏈接任何數(shù)組,那么最終的結(jié)果一定是以某個(gè)元素為結(jié)尾的子數(shù)組,因此我們從所有的dp(i)中取一個(gè)最大的就好了,依賴子問題解決當(dāng)前問題的解就是所謂的動(dòng)態(tài)規(guī)劃。

有了這些分析,代碼非常簡(jiǎn)單:

intmaxSubArray(vector&nums){
intsize=nums.size();
vectordp(size,0);
intres=dp[0]=nums[0];
for(inti=1;ireturnres;
}

這段代碼簡(jiǎn)單到讓人難以置信,只有8行代碼,你甚至可能會(huì)懷疑這段代碼的正確性,但它的確是沒有任何問題的,而且這段代碼的時(shí)間復(fù)雜度只有O(N),這段代碼既簡(jiǎn)單運(yùn)行速度又快,這大概就是算法的魅力吧。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4970

    瀏覽量

    74018
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27377

原文標(biāo)題:動(dòng)態(tài)規(guī)劃:8行代碼搞定最大子數(shù)組和問題

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    EN18031 認(rèn)證全解析:三大子標(biāo)準(zhǔn)搞定歐盟網(wǎng)絡(luò)安全合規(guī)

    2026年歐盟網(wǎng)絡(luò)安全監(jiān)管持續(xù)收緊,EN18031作為RED指令強(qiáng)制網(wǎng)絡(luò)安全標(biāo)準(zhǔn),已成為無線設(shè)備出海歐盟的核心門檻。該認(rèn)證由三大子標(biāo)準(zhǔn)構(gòu)成,分別對(duì)應(yīng)不同安全場(chǎng)景,精準(zhǔn)匹配即可高效完成合規(guī)。本文全面
    的頭像 發(fā)表于 02-06 15:41 ?1937次閱讀
    EN18031 認(rèn)證全解析:三<b class='flag-5'>大子</b>標(biāo)準(zhǔn)<b class='flag-5'>搞定</b>歐盟網(wǎng)絡(luò)安全合規(guī)

    不懂編程,怎么搞定電子儀表上位機(jī)軟件?零代碼搞定上位機(jī)軟件開發(fā)

    “不懂編程,怎么搞定電子儀表上位機(jī)軟件?”這是很多電子儀表用戶的共同困惑。傳統(tǒng)上位機(jī)開發(fā)被“專業(yè)編程”門檻牢牢限制,即便你對(duì)測(cè)試需求了如指掌(比如知道要采集哪些儀表數(shù)據(jù)、怎么分析波形、怎么生成
    的頭像 發(fā)表于 01-27 17:19 ?584次閱讀
    不懂編程,怎么<b class='flag-5'>搞定</b>電子儀表上位機(jī)軟件?零<b class='flag-5'>代碼</b><b class='flag-5'>搞定</b>上位機(jī)軟件開發(fā)

    RT-Thread Vector軟件包:嵌入式開發(fā)的動(dòng)態(tài)數(shù)組容器 | 技術(shù)集結(jié)

    RT-Thread Vector軟件包:嵌入式開發(fā)的動(dòng)態(tài)數(shù)組容器 | 技術(shù)集結(jié)
    的頭像 發(fā)表于 01-25 09:33 ?5418次閱讀
    RT-Thread Vector軟件包:嵌入式開發(fā)的<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>數(shù)組</b>容器 | 技術(shù)集結(jié)

    keil中c語(yǔ)言的動(dòng)態(tài)分配內(nèi)存

    )包含柔性數(shù)組成員的結(jié)構(gòu)體要用malloc函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存分配,并且分配的內(nèi)存應(yīng)該大于該結(jié)構(gòu)體的大小以適應(yīng)柔性數(shù)組的預(yù)期大小。看下面的代碼: 其實(shí)上面的
    發(fā)表于 01-21 06:04

    深開鴻開源鴻蒙社區(qū)主干代碼貢獻(xiàn)量破650萬(wàn)

    歷經(jīng)五年發(fā)展,開源鴻蒙已從技術(shù)萌芽成長(zhǎng)為萬(wàn)物智聯(lián)時(shí)代的核心數(shù)字底座。秉持開源、共建、共享、共榮的理念,其生態(tài)規(guī)模持續(xù)擴(kuò)張,累計(jì)匯聚超10000名貢獻(xiàn)者、510多家合作伙伴,沉淀1.3億代碼
    的頭像 發(fā)表于 01-07 10:22 ?522次閱讀

    二維數(shù)組介紹

    大家不要認(rèn)為二維數(shù)組在內(nèi)存中就是按、列這樣二維存儲(chǔ)的,實(shí)際上,不管二維、三維數(shù)組… 都是編譯器的語(yǔ)法糖。 存儲(chǔ)上和一維數(shù)組沒有本質(zhì)區(qū)別,舉個(gè)例子: int array[3][3
    發(fā)表于 11-25 07:42

    基于感知引導(dǎo)的多步驟精細(xì)操作任務(wù)與運(yùn)動(dòng)規(guī)劃

    傳統(tǒng)的任務(wù)與運(yùn)動(dòng)規(guī)劃(TAMP)系統(tǒng)在機(jī)器人操作應(yīng)用中通常依賴靜態(tài)模型運(yùn)行,因此在面對(duì)新環(huán)境時(shí)往往表現(xiàn)不佳。將感知與操作相融合,是應(yīng)對(duì)這一挑戰(zhàn)的有效途徑,使機(jī)器人能夠在執(zhí)行過程中實(shí)時(shí)更新規(guī)劃,從而適應(yīng)動(dòng)態(tài)變化的場(chǎng)景。
    的頭像 發(fā)表于 11-14 10:18 ?1469次閱讀
    基于感知引導(dǎo)的多步驟精細(xì)操作任務(wù)與運(yùn)動(dòng)<b class='flag-5'>規(guī)劃</b>

    基于SIMP與折衷規(guī)劃法的航空附件齒輪箱結(jié)構(gòu)輕量化設(shè)計(jì)與動(dòng)態(tài)特性提升

    航空發(fā)動(dòng)機(jī)附件齒輪箱作為動(dòng)力傳遞系統(tǒng)的關(guān)鍵部件,其箱體結(jié)構(gòu)設(shè)計(jì)直接影響發(fā)動(dòng)機(jī)的功率密度、可靠性及振動(dòng)特性。針對(duì)傳統(tǒng)經(jīng)驗(yàn)設(shè)計(jì)方法難以滿足高剛度、輕量化及高動(dòng)態(tài)性能要求的挑戰(zhàn),本文提出了一種基于折衷規(guī)劃法的多目標(biāo)拓?fù)鋬?yōu)化方法。
    的頭像 發(fā)表于 11-07 15:21 ?759次閱讀
    基于SIMP與折衷<b class='flag-5'>規(guī)劃</b>法的航空附件齒輪箱結(jié)構(gòu)輕量化設(shè)計(jì)與<b class='flag-5'>動(dòng)態(tài)</b>特性提升

    加載動(dòng)態(tài)模塊報(bào)錯(cuò),提示memset函數(shù)未找到,但是代碼沒用到memset,為什么?

    動(dòng)態(tài)模塊提示memset未找到,但是代碼沒用到memset。 報(bào)錯(cuò): Module: can’t find memset in kernel symbol table
    發(fā)表于 10-14 06:59

    商品價(jià)格動(dòng)態(tài)調(diào)整接口技術(shù)詳解

    ? ?在電商或零售系統(tǒng)中,商品價(jià)格需根據(jù)市場(chǎng)動(dòng)態(tài)(如供需變化、競(jìng)爭(zhēng)環(huán)境)實(shí)時(shí)調(diào)整,以最大化利潤(rùn)和競(jìng)爭(zhēng)力。本文將從接口設(shè)計(jì)、核心算法、實(shí)現(xiàn)代碼到優(yōu)化策略,逐步解析如何構(gòu)建一個(gè)高效的“商品價(jià)格動(dòng)態(tài)
    的頭像 發(fā)表于 10-13 15:49 ?415次閱讀
    商品價(jià)格<b class='flag-5'>動(dòng)態(tài)</b>調(diào)整接口技術(shù)詳解

    虹科動(dòng)態(tài) | 2025年8月精彩回顧

    」...下面讓我們一起回顧8月的虹科動(dòng)態(tài)吧,9月精彩活動(dòng)預(yù)告也不容錯(cuò)過!01虹科動(dòng)態(tài)1品牌動(dòng)態(tài)8月7日,香港工業(yè)總會(huì)在港舉辦第65屆周年大會(huì)
    的頭像 發(fā)表于 09-02 10:13 ?819次閱讀
    虹科<b class='flag-5'>動(dòng)態(tài)</b> | 2025年<b class='flag-5'>8</b>月精彩回顧

    華礪智成立八周年

    以落地中國(guó)為起點(diǎn),2017年8月,華礪智砥礪八載春秋,從幾行通信代碼到覆蓋三大洲的智慧路網(wǎng),用2920個(gè)晝夜完成了一場(chǎng)關(guān)于堅(jiān)持的敘事,淬煉出堅(jiān)固、立體、創(chuàng)新的多面形態(tài)。
    的頭像 發(fā)表于 08-20 14:51 ?863次閱讀

    AGV小車中的動(dòng)態(tài)路徑規(guī)劃算法揭秘

    并非一成不變時(shí),動(dòng)態(tài)路徑規(guī)劃能力就顯得至關(guān)重要。本文將深入探討幾種主流的動(dòng)態(tài)路徑規(guī)劃算法(如A、Dijkstra、RRT等),并解析它們?nèi)绾卧贏GV行業(yè)中大顯身手。 為何需要
    的頭像 發(fā)表于 06-17 15:54 ?1732次閱讀
    AGV小車中的<b class='flag-5'>動(dòng)態(tài)</b>路徑<b class='flag-5'>規(guī)劃</b>算法揭秘

    二維數(shù)組指定條件刪除指定,請(qǐng)教

    對(duì)數(shù)組1的第一列進(jìn)行條件判斷,如果小于20,刪除所在行,最終需要得到數(shù)組2
    發(fā)表于 05-13 08:11

    業(yè)精于視,成于旗—視旗科技CEO曾帥先生專訪

    企業(yè)家,用二十年生動(dòng)詮釋“學(xué)一愛一干一”的強(qiáng)大精神力量可以實(shí)現(xiàn)人生“逆襲”。相信才會(huì)看見,信仰力量和赤子情懷驅(qū)動(dòng)他在上海9年、深圳8年奮發(fā)圖強(qiáng);看見會(huì)有未來,
    的頭像 發(fā)表于 04-25 17:19 ?734次閱讀
    業(yè)精于視,<b class='flag-5'>行</b>成于旗—視旗科技CEO曾帥先生專訪