chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

動態(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ù)組,給定一個數(shù)組,找到其中的一個連續(xù)子數(shù)組,其和最大。

示例:

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

想一想該怎樣解決這個問題。

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

暴力求解

這種解法最簡單,我們把所有子數(shù)組找出來,然后依次計算其和,找出一個最大的出來,比如給定數(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;
}

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

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

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

基于該思想我們可以對上述代碼簡單改造一下:

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

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

還有沒有進一步提高的空間呢?

答案是肯定的。

分而治之

我們在之前的文章中說過,分治也是一種非常強大的思想,具體應(yīng)該這里的話我們可以把整個數(shù)組一分為二,然后子數(shù)組也一分為二,不斷劃分下去就像這樣:

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

然后呢?

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

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

假設(shè)對于數(shù)組[1,2,3,4],一次劃分后得到了[1,2]與[3,4],用上面的方法我們可以分別知道這兩個問題的最大子數(shù)組和,我們怎樣利用上述的答案來解決更大的問題,也就是[1,2,3,4]呢?

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

其實這個問題很簡單,我們從中間開始往兩邊不斷累加,然后記下這個過程的最大值,比如對于[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ù)字為起點向右累加:

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

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

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

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

根據(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);
}

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

動態(tài)規(guī)劃

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

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

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

有了這些分析,代碼非常簡單:

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

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

審核編輯 :李倩


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

    關(guān)注

    30

    文章

    4940

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    27104

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    二維數(shù)組介紹

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

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

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

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

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

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

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

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

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

    華礪智成立八周年

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

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

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

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

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

    HarmonyOS NEXT 原生應(yīng)用/元服務(wù)-ArkTS代碼調(diào)試使用斷點

    光標(biāo)置于該行上并按Ctrl + F8(macOS為Command+F8)。 當(dāng)您設(shè)置斷點時,相應(yīng)的代碼旁邊會出現(xiàn)一個紅點,如圖。 在設(shè)置的斷點紅點處,單擊鼠標(biāo)右鍵,在Conditio
    發(fā)表于 03-04 17:15

    8通道LED陽極驅(qū)動電路——AiP3318

    8通道LED陽極驅(qū)動電路——AiP3318
    的頭像 發(fā)表于 02-18 09:49 ?864次閱讀
    <b class='flag-5'>8</b>通道LED陽極<b class='flag-5'>行</b>驅(qū)動電路——AiP3318

    RK3576有多強?實測三屏八攝像頭輕松搞定

    RK3576參數(shù)強勁RK3576是瑞芯微推出的一款高性能AIoT處理器,這款芯片以其卓越的計算能力、多屏幕支持、強大的視頻編解碼能力和高效的協(xié)處理器而聞名。三屏8攝像頭輕松搞定米爾基于他們推出
    的頭像 發(fā)表于 01-16 08:06 ?1152次閱讀
    RK3576有多強?實測三屏八攝像頭輕松<b class='flag-5'>搞定</b>

    Labivew 實現(xiàn)鼠標(biāo)在數(shù)組中選中元素時,精準(zhǔn)的顯示所在位置的、列值方法

    在項目開發(fā)中,遇到一個布爾的二維數(shù)組輸入控件,選中數(shù)組元素并索引出行列的操作,試過其他大佬的方法,不是特別精準(zhǔn),,嘗試一下還可以,分享給需要的朋友 *附件:選中二維數(shù)組元素并索引所在的
    發(fā)表于 12-21 18:07

    數(shù)組的下標(biāo)為什么可以是負數(shù)

    最近有同學(xué)發(fā)來這樣一段代碼,并提出一個問題,數(shù)組的下標(biāo)為什么可以是負數(shù)? ? ? #include int main(){ const char *s = "helloworld"; const
    的頭像 發(fā)表于 12-20 11:18 ?844次閱讀

    北汽集團戰(zhàn)略投資小馬智7035萬美元

    日前,北汽集團戰(zhàn)略投資小馬智7035萬美元,小馬智于11月27日在美國納斯達克掛牌上市(股票代碼“PONY”),公開發(fā)行定價為13美元/ADS,融資額達2.99億美元,成為今年以來美股自動駕駛領(lǐng)域
    的頭像 發(fā)表于 12-02 11:46 ?1031次閱讀

    自動駕駛企業(yè)小馬智登陸納斯達克

    近日,小馬智正式在納斯達克掛牌上市,股票代碼“PONY”,公開發(fā)行定價為13美元/ADS,融資額達2.99億美元,成為今年以來美股自動駕駛領(lǐng)域最大規(guī)模IPO。
    的頭像 發(fā)表于 11-29 09:59 ?932次閱讀