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

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ù)組和問(wèn)題

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

掃碼添加小助手

加入工程師交流群

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

今天給大家?guī)?lái)一道極其經(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ù)組和不超過(guò)6.

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

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

暴力求解

這種解法最簡(jiǎn)單,我們把所有子數(shù)組找出來(lái),然后依次計(jì)算其和,找出一個(gè)最大的出來(lái),比如給定數(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è)賮?lái)看一下這個(gè)過(guò)程,這里的問(wèn)題在于計(jì)算每個(gè)子數(shù)組的和時(shí)有很多重復(fù)計(jì)算,比如我們知道了子數(shù)組[1,2]的和后再計(jì)算數(shù)組[1,2,3]的值時(shí)完全可以利用子數(shù)組[1,2]的計(jì)算結(jié)果而無(wú)需從頭到尾再算一遍,也就是說(shuō)我們可以利用上一步的計(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),比第一種解法高了很多。

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

答案是肯定的。

分而治之

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

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

然后呢?

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

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

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

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

其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,我們從中間開始往兩邊不斷累加,然后記下這個(gè)過(guò)程的最大值,比如對(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

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

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

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

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

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

根據(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è)問(wèn)題還有另一種更妙的解決方法,我們令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è)最大的就好了,依賴子問(wèn)題解決當(dāng)前問(wèn)題的解就是所謂的動(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ì)懷疑這段代碼的正確性,但它的確是沒(méi)有任何問(wèn)題的,而且這段代碼的時(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ī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    26541

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    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 ?319次閱讀
    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

    8通道LED陽(yáng)極驅(qū)動(dòng)電路——AiP3318

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

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

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

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

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

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

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

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

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

    小馬智納斯達(dá)克掛牌上市

    近日,小馬智正式在納斯達(dá)克掛牌上市,股票代碼“PONY”,成為Robotaxi第一股。在擴(kuò)大發(fā)行規(guī)模后,若承銷商的超額配售權(quán)悉數(shù)行使,小馬智行將以每股13美元的發(fā)行區(qū)間價(jià)上限發(fā)行總計(jì)2300萬(wàn)股
    的頭像 發(fā)表于 11-28 09:55 ?588次閱讀

    數(shù)組名之間可以直接賦值嗎

    數(shù)組之間的賦值能不能直接使用等于號(hào)?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發(fā)表于 11-26 11:23 ?630次閱讀

    指針數(shù)組和二維數(shù)組有沒(méi)有區(qū)別

    指針數(shù)組和二維數(shù)組有沒(méi)有區(qū)別?比如這樣的兩個(gè)代碼。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][6
    的頭像 發(fā)表于 11-24 11:12 ?544次閱讀

    C語(yǔ)言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組

    C語(yǔ)言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組
    發(fā)表于 11-20 15:33 ?1次下載

    8通道3.2A輸出電流消隱可調(diào)共陰驅(qū)動(dòng)芯片SM5188詳解

    8通道3.2A輸出電流消隱可調(diào)共陰驅(qū)動(dòng)芯片 通道數(shù)與電流輸出: 提供8通道的驅(qū)動(dòng)能力,可以同時(shí)控制8路LED或其他電子設(shè)備的運(yùn)行。 每個(gè)通道的最大
    的頭像 發(fā)表于 11-20 14:21 ?842次閱讀
    <b class='flag-5'>8</b>通道3.2A輸出電流消隱可調(diào)共陰<b class='flag-5'>行</b>驅(qū)動(dòng)芯片SM5188詳解

    labview按讀取二維數(shù)組之后再按讀取順序重新組成二維數(shù)組如何實(shí)現(xiàn)?

    labview用了index Array按索引一行行讀取二維數(shù)組之后想再按讀取順序重新組成一個(gè)二維數(shù)組如何實(shí)現(xiàn),即第一次讀取的作為第一,第二次讀取的作為第二
    發(fā)表于 10-25 21:06

    labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    在LabVIEW中,將字符串數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項(xiàng)常見(jiàn)的任務(wù),尤其是在處理數(shù)據(jù)采集、信號(hào)處理或用戶輸入時(shí)。 1. 理解LabVIEW的數(shù)據(jù)類型 在開始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?5655次閱讀

    面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針函數(shù)與函數(shù)指針指針函數(shù):定義:指針
    的頭像 發(fā)表于 08-10 08:11 ?1455次閱讀
    面試常考+1:函數(shù)指針與指針函數(shù)、<b class='flag-5'>數(shù)組</b>指針與指針<b class='flag-5'>數(shù)組</b>