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

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

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

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

最大子序和,貪心解法

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

掃碼添加小助手

加入工程師交流群

53. 最大子序和

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

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

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

暴力解法

暴力解法的思路,第一層for 就是設(shè)置起始位置,第二層for循環(huán)遍歷數(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開始遍歷尋找最大值
count+=nums[j];
result=count>result?count:result;
}
}
returnresult;
}
};

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

貪心解法

貪心貪的是哪里呢?

如果 -2 1 在一起,計算起點(diǎn)的時候,一定是從1開始計算,因為負(fù)數(shù)只會拉低總和,這就是貪心貪的地方!

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

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

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

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

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

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

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

if(count>result)result=count;

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

如動畫所示:

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

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

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

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

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

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

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

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

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

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

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;
}
};

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

總結(jié)

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

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

其他語言版本

Java

classSolution{
publicintmaxSubArray(int[]nums){
if(nums.length==1){
returnnums[0];
}
intsum=Integer.MIN_VALUE;
intcount=0;
for(inti=0;i//取區(qū)間累計的最大值(相當(dāng)于不斷確定最大子序終止位置)
if(count<=?0){
count=0;//相當(dāng)于重置最大子序起始位置,因為遇到負(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • DP
    DP
    +關(guān)注

    關(guān)注

    1

    文章

    240

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    27104

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    上新 | 有限空間“新解法”!凌科LP20系列90°工業(yè)級連接器新品上市

    LP20系列90°連接器新品緊湊布線有了新選擇,90°結(jié)構(gòu)讓空間局限有了“新解法”。凌科LP20系列90°工業(yè)級連接器全新上線,為有限空間布線和轉(zhuǎn)角布線帶來全新連接解決方案。LP20系列90°連接器
    的頭像 發(fā)表于 11-04 18:12 ?194次閱讀
    上新 | 有限空間“新<b class='flag-5'>解法</b>”!凌科LP20系列90°工業(yè)級連接器新品上市

    禎達(dá)生物利用NVIDIA Parabricks技術(shù)加速多組學(xué)分析

    禎達(dá)生物是中國領(lǐng)先的多組學(xué)和測序服務(wù)提供商之一,該公司利用 NVIDIA Parabricks 來加速多組學(xué)分析。借助 Parabricks,禎達(dá)生物將全基因組測序的時間從 7 小時縮短至 31
    的頭像 發(fā)表于 09-29 16:05 ?585次閱讀

    LM3881系列 3軌簡單功率定器技術(shù)手冊

    LM3881 簡單電源定器提供了控制上電和電源的最簡單方法 多個電源(開關(guān)或線性穩(wěn)壓器)的關(guān)閉。通過錯開啟動 序列,可以避免可能影響 系統(tǒng)的可靠性。
    的頭像 發(fā)表于 08-19 13:49 ?679次閱讀
    LM3881系列 3軌簡單功率定<b class='flag-5'>序</b>器技術(shù)手冊

    UCD9090-Q1 汽車10通道定器和系統(tǒng)健康監(jiān)測器技術(shù)手冊

    UCD9090-Q1 是一款 10 軌 PMBus 和 I^2^C 可尋址電源定器和監(jiān)視器。該器件集成了一個 12 位 ADC,用于監(jiān)控多達(dá) 10 個電源電壓輸入。23 個 GPIO 引腳可用
    的頭像 發(fā)表于 08-19 09:46 ?613次閱讀
    UCD9090-Q1 汽車10通道定<b class='flag-5'>序</b>器和系統(tǒng)健康監(jiān)測器技術(shù)手冊

    UCD90320 32 軌 PMBus 電源定器和系統(tǒng)管理器技術(shù)手冊

    UCD90320器件是一款 32 軌 PMBus? 可尋址電源定器和系統(tǒng)管理器,采用緊湊的 0.8 mm 間距 BGA 封裝。 24 個集成 ADC 通道 (AMONx) 監(jiān)控電源電壓、電流
    的頭像 發(fā)表于 08-19 09:29 ?667次閱讀
    UCD90320 32 軌 PMBus 電源定<b class='flag-5'>序</b>器和系統(tǒng)管理器技術(shù)手冊

    UCD90320U 32 軌 PMBus 功率定器和系統(tǒng)管理器,具有 SEU 檢測功能技術(shù)手冊

    UCD90320U器件是一款 32 軌 PMBus? 可尋址電源定器和系統(tǒng)管理器,采用緊湊的 0.8 mm 間距 BGA 封裝。采用ULA模塑料,減少α顆粒引起的軟誤差。該器件掃描用戶配置 SRAM 以檢測單事件擾亂 (SEU)。這兩種功能都為應(yīng)用提供了更高的可靠性。
    的頭像 發(fā)表于 08-19 09:17 ?574次閱讀
    UCD90320U 32 軌 PMBus 功率定<b class='flag-5'>序</b>器和系統(tǒng)管理器,具有 SEU 檢測功能技術(shù)手冊

    福祿克電機(jī)和相旋轉(zhuǎn)指示儀的使用方法

    三相電由于自身特性,三根火線之間存在相。通常情況下,三相線路在安裝時,需要確保其相正確。若相不正常,可能會導(dǎo)致設(shè)備工作效率下降,電機(jī)運(yùn)轉(zhuǎn)異常,嚴(yán)重時可能損壞用電設(shè)備。
    的頭像 發(fā)表于 07-07 15:51 ?784次閱讀

    諧波驅(qū)動六相PMSM雙電機(jī)串聯(lián)系統(tǒng)研究

    摘要:研究了一種基于零諧波驅(qū)動的雙Y移30°永磁同步電動機(jī)(PMSM)雙電機(jī)串聯(lián)系統(tǒng),分析了零諧波驅(qū)動串聯(lián)系統(tǒng)的工作原理,建立了兩臺PMSM定子繞組串聯(lián)聯(lián)結(jié)的相轉(zhuǎn)換關(guān)系,給出了串聯(lián)系統(tǒng)的獨(dú)立解
    發(fā)表于 06-09 16:27

    模擬電路故障診斷

    本書主要介紹了故障字典法,元件參數(shù)解法,故障的預(yù)猜驗證法,逼近法,模擬電路故障診斷的現(xiàn)狀及發(fā)展趨勢。
    發(fā)表于 03-07 14:38

    請教ADS1292時問題

    關(guān)于ADS1292時問題 大家好,我最近在做個小東西,用MSP430F5529控制ADS1292,目前在調(diào)試程序。按照芯片手冊上的時序圖寫的,并且讀出寄存器的值,但是發(fā)現(xiàn)有時候能準(zhǔn)確讀出數(shù)值
    發(fā)表于 01-20 09:01

    光纖的色是怎么排列的

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

    HDJB-9000合并單元數(shù)模一體繼電保護(hù)綜合測試系統(tǒng)做方向零過流方法

    1.1.1.方向零過流概述方向零過流保護(hù)主要用于對零過電流繼電器和方向繼電器進(jìn)行測試。包含以下三種測試模塊:定點(diǎn)試驗:用于校驗定時限以及速斷零電流保護(hù)的定值。批量試驗:用于批量
    的頭像 發(fā)表于 12-24 10:51 ?1111次閱讀
    HDJB-9000合并單元數(shù)模一體繼電保護(hù)綜合測試系統(tǒng)做方向零<b class='flag-5'>序</b>過流方法

    ADS5547, DAC8822時圖上只有數(shù)據(jù)在寄存器之間轉(zhuǎn)換的時序,難道更新速率只和數(shù)據(jù)在寄存器之間轉(zhuǎn)換時間有關(guān)嗎?

    ADS5547, DAC8822時圖上只有數(shù)據(jù)在寄存器之間轉(zhuǎn)換的時序,難道更新速率只和數(shù)據(jù)在寄存器之間轉(zhuǎn)換時間有關(guān)嗎?
    發(fā)表于 12-20 07:28

    UCD90xxx定器原理圖指南

    電子發(fā)燒友網(wǎng)站提供《UCD90xxx定器原理圖指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-04 15:24 ?0次下載
    UCD90xxx定<b class='flag-5'>序</b>器原理圖指南

    UCD90320定器和系統(tǒng)健康控制器PMBus命令參考

    電子發(fā)燒友網(wǎng)站提供《UCD90320定器和系統(tǒng)健康控制器PMBus命令參考.pdf》資料免費(fèi)下載
    發(fā)表于 11-29 15:53 ?0次下載
    UCD90320定<b class='flag-5'>序</b>器和系統(tǒng)健康控制器PMBus命令參考