一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

最大子序和,貪心解法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-05-10 10:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

53. 最大子序和

力扣題目鏈接:https://leetcode-cn.com/problems/maximum-subarray

給定一個(gè)整數(shù)數(shù)組 nums ,找到一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個(gè)元素),返回其最大和。

示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋:連續(xù)子數(shù)組[4,-1,2,1] 的和最大,為 6。

暴力解法

暴力解法的思路,第一層for 就是設(shè)置起始位置,第二層for循環(huán)遍歷數(shù)組尋找最大值

時(shí)間復(fù)雜度:O(n^2) 空間復(fù)雜度:O(1)

classSolution{
public:
intmaxSubArray(vector<int>&nums){
intresult=INT32_MIN;
intcount=0;
for(inti=0;i//設(shè)置起始位置
count=0;
for(intj=i;j//每次從起始位置i開(kāi)始遍歷尋找最大值
count+=nums[j];
result=count>result?count:result;
}
}
returnresult;
}
};

以上暴力的解法C++勉強(qiáng)可以過(guò),其他語(yǔ)言就不確定了。

貪心解法

貪心貪的是哪里呢?

如果 -2 1 在一起,計(jì)算起點(diǎn)的時(shí)候,一定是從1開(kāi)始計(jì)算,因?yàn)樨?fù)數(shù)只會(huì)拉低總和,這就是貪心貪的地方!

局部最優(yōu):當(dāng)前“連續(xù)和”為負(fù)數(shù)的時(shí)候立刻放棄,從下一個(gè)元素重新計(jì)算“連續(xù)和”,因?yàn)樨?fù)數(shù)加上下一個(gè)元素 “連續(xù)和”只會(huì)越來(lái)越小。

全局最優(yōu):選取最大“連續(xù)和”

局部最優(yōu)的情況下,并記錄最大的“連續(xù)和”,可以推出全局最優(yōu)。

從代碼角度上來(lái)講:遍歷nums,從頭開(kāi)始用count累積,如果count一旦加上nums[i]變?yōu)樨?fù)數(shù),那么就應(yīng)該從nums[i+1]開(kāi)始從0累積count了,因?yàn)橐呀?jīng)變?yōu)樨?fù)數(shù)的count,只會(huì)拖累總和。

這相當(dāng)于是暴力解法中的不斷調(diào)整最大子序和區(qū)間的起始位置。

那有同學(xué)問(wèn)了,區(qū)間終止位置不用調(diào)整么?如何才能得到最大“連續(xù)和”呢?

區(qū)間的終止位置,其實(shí)就是如果count取到最大值了,及時(shí)記錄下來(lái)了。例如如下代碼:

if(count>result)result=count;

這樣相當(dāng)于是用result記錄最大子序和區(qū)間和(變相的算是調(diào)整了終止位置)。

如動(dòng)畫(huà)所示:

88d26216-d009-11ec-bce3-dac502259ad0.gif53.最大子序和

紅色的起始位置就是貪心每次取count為正數(shù)的時(shí)候,開(kāi)始一個(gè)區(qū)間的統(tǒng)計(jì)。

那么不難寫(xiě)出如下C++代碼(關(guān)鍵地方已經(jīng)注釋)

classSolution{
public:
intmaxSubArray(vector<int>&nums){
intresult=INT32_MIN;
intcount=0;
for(inti=0;iif(count>result){//取區(qū)間累計(jì)的最大值(相當(dāng)于不斷確定最大子序終止位置)
result=count;
}
if(count<=?0)count=0;//相當(dāng)于重置最大子序起始位置,因?yàn)橛龅截?fù)數(shù)一定是拉低總和
}
returnresult;
}
};

時(shí)間復(fù)雜度:O(n) 空間復(fù)雜度:O(1)

當(dāng)然題目沒(méi)有說(shuō)如果數(shù)組為空,應(yīng)該返回什么,所以數(shù)組為空的話返回啥都可以了。

不少同學(xué)認(rèn)為 如果輸入用例都是-1,或者 都是負(fù)數(shù),這個(gè)貪心算法跑出來(lái)的結(jié)果是0, 這是又一次證明腦洞模擬不靠譜的經(jīng)典案例,建議大家把代碼運(yùn)行一下試一試,就知道了,也會(huì)理解 為什么 result 要初始化為最小負(fù)數(shù)了。

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

當(dāng)然本題還可以用動(dòng)態(tài)規(guī)劃來(lái)做,當(dāng)前「代碼隨想錄」主要講解貪心系列,后續(xù)到動(dòng)態(tài)規(guī)劃系列的時(shí)候會(huì)詳細(xì)講解本題的dp方法。

那么先給出我的dp代碼如下,有時(shí)間的錄友可以提前做一做:

classSolution{
public:
intmaxSubArray(vector<int>&nums){
if(nums.size()==0)return0;
vector<int>dp(nums.size(),0);//dp[i]表示包括i之前的最大連續(xù)子序列和
dp[0]=nums[0];
intresult=dp[0];
for(inti=1;i1]+nums[i],nums[i]);//狀態(tài)轉(zhuǎn)移公式
if(dp[i]>result)result=dp[i];//result保存dp[i]的最大值
}
returnresult;
}
};

時(shí)間復(fù)雜度:O(n) 空間復(fù)雜度:O(n)

總結(jié)

本題的貪心思路其實(shí)并不好想,這也進(jìn)一步驗(yàn)證了,別看貪心理論很直白,有時(shí)候看似是常識(shí),但貪心的題目一點(diǎn)都不簡(jiǎn)單!

后續(xù)將介紹的貪心題目都挺難的,哈哈,所以貪心很有意思,別小看貪心!

其他語(yǔ)言版本

Java

classSolution{
publicintmaxSubArray(int[]nums){
if(nums.length==1){
returnnums[0];
}
intsum=Integer.MIN_VALUE;
intcount=0;
for(inti=0;i//取區(qū)間累計(jì)的最大值(相當(dāng)于不斷確定最大子序終止位置)
if(count<=?0){
count=0;//相當(dāng)于重置最大子序起始位置,因?yàn)橛龅截?fù)數(shù)一定是拉低總和
}
}
returnsum;
}
}
//DP方法
classSolution{
publicintmaxSubArray(int[]nums){
intans=Integer.MIN_VALUE;
int[]dp=newint[nums.length];
dp[0]=nums[0];
ans=dp[0];

for(inti=1;i1]+nums[i],nums[i]);
ans=Math.max(dp[i],ans);
}

returnans;
}
}

Python

classSolution:
defmaxSubArray(self,nums:List[int])->int:
result=-float('inf')
count=0
foriinrange(len(nums)):
count+=nums[i]
ifcount>result:
result=count
ifcount<=?0:
count=0
returnresult

Go

funcmaxSubArray(nums[]int)int{
maxSum:=nums[0]
fori:=1;ilen(nums);i++{
ifnums[i]+nums[i-1]>nums[i]{
nums[i]+=nums[i-1]
}
ifnums[i]>maxSum{
maxSum=nums[i]
}
}
returnmaxSum
}

--- EOF ---

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • DP
    DP
    +關(guān)注

    關(guān)注

    1

    文章

    235

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    26557

原文標(biāo)題:最大子序和,又貪心又DP

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    光纖的色是怎么排列的

    光纖的色排列通常遵循特定的標(biāo)準(zhǔn),主要有兩種色排列方式,即BELLCORE的國(guó)標(biāo)纖芯順序和國(guó)標(biāo)全色譜。 BELLCORE的國(guó)標(biāo)纖芯順序 顏色排列:藍(lán)、橙(桔)、綠、棕、灰、白、紅、黑、黃、紫、粉紅
    的頭像 發(fā)表于 01-06 17:53 ?2175次閱讀

    電流互感器的檢測(cè)原理

    電流互感器的檢測(cè)原理主要基于電磁感應(yīng)定律和基爾霍夫電流定律,用于檢測(cè)電力系統(tǒng)中由于三相電流不平衡而產(chǎn)生的零電流。
    的頭像 發(fā)表于 09-06 12:28 ?1643次閱讀

    ?核對(duì)電纜相的小技巧

    核對(duì)電纜相的技巧要訣核對(duì)相很重要,相不對(duì)事故到;一般沒(méi)有相表,蓄電池?zé)粲每考记?;一?cè)相已明了,把它接地電阻小,一根燈線向地跑,還有
    的頭像 發(fā)表于 08-08 16:08 ?1273次閱讀
    ?核對(duì)電纜相<b class='flag-5'>序</b>的小技巧

    為什么有些TINA-TI仿真可以實(shí)現(xiàn)穩(wěn)態(tài)求解法分析,而有些不行?

    為什么有些TINA-TI仿真可以實(shí)現(xiàn)穩(wěn)態(tài)求解法分析,而有些不行,出現(xiàn)提示: ,無(wú)法執(zhí)行穩(wěn)態(tài)分析。 是有什么區(qū)別嗎?還是哪里需要設(shè)置嗎?
    發(fā)表于 08-08 08:28

    斷相保護(hù)的原理、應(yīng)用和接線方法

    斷相保護(hù)是一種電氣保護(hù)措施,用于防止電動(dòng)機(jī)因相錯(cuò)誤或斷相故障而損壞。在工業(yè)自動(dòng)化和電氣工程中,相斷相保護(hù)是非常重要的。 相斷相保護(hù)的原理 相
    的頭像 發(fā)表于 08-02 14:38 ?4350次閱讀

    繼電器使用方法與接線方法

    繼電器是一種用于保護(hù)電機(jī)、發(fā)電機(jī)和變壓器等設(shè)備的電氣元件,它通過(guò)監(jiān)測(cè)電氣系統(tǒng)的相變化來(lái)確保設(shè)備在正確的相下運(yùn)行。當(dāng)相錯(cuò)誤或電源缺相時(shí),相
    的頭像 發(fā)表于 08-02 14:34 ?3723次閱讀

    繼電器的接線方法及工作原理

    引言 相繼電器是一種用于檢測(cè)電源相的電氣設(shè)備,其主要作用是確保電動(dòng)機(jī)或其他電氣設(shè)備在正確的相下工作。在工業(yè)自動(dòng)化、電力系統(tǒng)等領(lǐng)域,相繼電器的應(yīng)用非常廣泛。 相
    的頭像 發(fā)表于 08-02 14:30 ?2783次閱讀

    保護(hù)器報(bào)警怎么解決

    保護(hù)器是一種用于檢測(cè)和保護(hù)電動(dòng)機(jī)相錯(cuò)誤的裝置,當(dāng)電動(dòng)機(jī)的相錯(cuò)誤時(shí),相保護(hù)器會(huì)發(fā)出報(bào)警信號(hào),以避免電動(dòng)機(jī)因相錯(cuò)誤而損壞或發(fā)生故障。
    的頭像 發(fā)表于 08-02 14:20 ?8413次閱讀

    保護(hù)器正常亮什么燈

    正常亮綠燈。相保護(hù)器是一種用于保護(hù)電動(dòng)機(jī)和其他電氣設(shè)備免受相錯(cuò)誤影響的裝置。它通過(guò)檢測(cè)電源的相,確保電動(dòng)機(jī)和其他設(shè)備在正確的相下運(yùn)行。相
    的頭像 發(fā)表于 08-02 14:18 ?5016次閱讀

    保護(hù)器的工作原理、分類(lèi)及選型

    保護(hù)器是一種用于保護(hù)電動(dòng)機(jī)和其他電氣設(shè)備免受相錯(cuò)誤影響的裝置。相錯(cuò)誤是指電動(dòng)機(jī)的三相電源輸入的相與電動(dòng)機(jī)的相要求不匹配,這可能導(dǎo)
    的頭像 發(fā)表于 08-02 14:16 ?6422次閱讀

    保護(hù)器如何知道正確相

    保護(hù)器是一種用于保護(hù)電氣設(shè)備免受相錯(cuò)誤影響的裝置。在電力系統(tǒng)中,相是指三相交流電的相位關(guān)系。正確的相可以確保電氣設(shè)備正常運(yùn)行,而錯(cuò)誤的相
    的頭像 發(fā)表于 08-02 14:13 ?3855次閱讀

    保護(hù)器怎么判斷好壞

    保護(hù)器是一種用于檢測(cè)和保護(hù)電力系統(tǒng)中相錯(cuò)誤的裝置。在電力系統(tǒng)中,相錯(cuò)誤可能會(huì)導(dǎo)致設(shè)備損壞、供電中斷等問(wèn)題,因此相保護(hù)器在電力系統(tǒng)中具有重要的作用。 一、相
    的頭像 發(fā)表于 08-02 14:11 ?3551次閱讀

    怎么判斷相繼電器壞了

    繼電器是一種用于檢測(cè)和保護(hù)電力系統(tǒng)中相故障的設(shè)備。它能夠檢測(cè)到電力系統(tǒng)中的相錯(cuò)誤,并在檢測(cè)到錯(cuò)誤時(shí)發(fā)出信號(hào),從而保護(hù)電力系統(tǒng)的正常運(yùn)行。然而,相繼電器在使用過(guò)程中可能會(huì)出現(xiàn)故
    的頭像 發(fā)表于 08-02 11:21 ?3296次閱讀

    互感器型號(hào)及參數(shù)詳解

    互感器是一種用于測(cè)量和保護(hù)電力系統(tǒng)中零電流的設(shè)備。在電力系統(tǒng)中,零電流是指三相電流不平衡時(shí)產(chǎn)生的電流,它可能導(dǎo)致設(shè)備損壞和電力系統(tǒng)的不穩(wěn)定。因此,零互感器在電力系統(tǒng)中具有重要
    的頭像 發(fā)表于 07-25 15:59 ?3341次閱讀

    互感器的作用是什么原理

    互感器是一種電力系統(tǒng)中常用的電氣設(shè)備,主要用于檢測(cè)和保護(hù)電力系統(tǒng)中的零電流。零電流是指三相電流不平衡時(shí)產(chǎn)生的電流,其大小和方向與三相電流的不平衡程度有關(guān)。零電流的存在會(huì)對(duì)電力
    的頭像 發(fā)表于 07-25 15:15 ?3950次閱讀