53. Maximum Subarray

20170706

今天再做這題甥材,寫出來(lái)了拉盾。這題之前說(shuō)的「局部最優(yōu)解」「全局最優(yōu)解」可以這么理解姊途,局部最優(yōu)解就相當(dāng)于dp[i-1]钉疫,因?yàn)槲覍懲陿?biāo)準(zhǔn)dp后很容易發(fā)現(xiàn)這個(gè)dp其實(shí)只需要知道前一位的狀態(tài)硼讽,所以就用個(gè)int來(lái)滾動(dòng)就行了,這個(gè)int就是所謂的局部最優(yōu)解牲阁。然后之前說(shuō)的局部最優(yōu)解必須包含當(dāng)前數(shù)字理郑,其實(shí)就是因?yàn)檫@題要求的是連續(xù)的subarray。

//標(biāo)準(zhǔn)
    public int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (dp[i - 1] > 0) {
                dp[i] = dp[i - 1] + nums[i];
            } else {
                dp[i] = nums[i];
            }
            max = Math.max(max, dp[i]);
        }
        return max;
    }
//滾動(dòng)
    public int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int curMax = nums[0];
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (curMax > 0) {
                curMax = curMax + nums[i];
            } else {
                curMax = nums[i];
            }
            max = Math.max(curMax, max);
        }
        return max;
    }

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

一道easy題咨油,一月份的時(shí)候做的您炉,現(xiàn)在再做又一時(shí)想不起來(lái)了。役电。這題是DP的思想赚爵,但是有很多種思路;最近看了code ganker的一些題目很多都用到了「局部最優(yōu)解」「全局最優(yōu)解」這個(gè)概念法瑟,比如Jump Game冀膝,Best Time to Buy and Sell Stock等。

這種思想的核心是霎挟,「局部最優(yōu)解」local表示「必須包含當(dāng)前一步操作」時(shí)候的最優(yōu)解窝剖,全局最優(yōu)解global就是代表全局最優(yōu)解,每步比較local和global酥夭。

State transition equation:

dp[i] = dp[i-1] >0 ? dp[i-1] + nums[i] : nums[i]

這題的方程赐纱,要注意是根據(jù)dp[i-1] >0的正負(fù)來(lái)判斷脊奋,跟nums[i]無(wú)關(guān)。
第二點(diǎn)疙描,由于「局部最優(yōu)解」local表示「必須包含當(dāng)前一步操作」時(shí)候的最優(yōu)解诚隙,所以這題dp數(shù)組的最后一位不能代表最優(yōu)結(jié)果,而是要維護(hù)的global起胰。

因?yàn)橹恍枰耙粋€(gè)位置的值久又,所以這道題可以狀態(tài)壓縮,可以這么寫:

    public int maxSubArray(int[] nums) {
        if (nums.length == 0) return 0;
        int local = nums[0];
        int global = nums[0];
        //local[i] = local[i-1] < 0 ? nums[i]: local[i-1]+nums[i]

        for (int i = 1; i < nums.length; i++) {
            local = local > 0 ? local + nums[i] : nums[i];
            global = Math.max(local, global);
        }
        return global;
    }

有時(shí)候我想不通為什么需要比較局部和最優(yōu)效五,原因就是局部因?yàn)橐?dāng)前的值所以有一定局限性地消。比如這道題,如果test case是一串負(fù)數(shù)畏妖,那global的作用就顯而易見了脉执。

我昨天有個(gè)疑問(wèn),是不是所以DP都需要用到一個(gè)數(shù)組保存狀態(tài)瓜客,空間換時(shí)間嘛适瓦。事實(shí)上不是的竿开,有些題目只需要用到之前一個(gè)子狀態(tài)谱仪,或者可以用空間輪換,就不需要數(shù)組否彩。比如疯攒,利用常規(guī)路子,這題還可以這樣寫

public int maxSubArray(int[] A) {
        int n = A.length;
        int[] dp = new int[n];//dp[i] means the maximum subarray ending with A[i];
        dp[0] = A[0];
        int max = dp[0];
        
        for(int i = 1; i < n; i++){
            dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
            max = Math.max(max, dp[i]);
        }
        
        return max;
}

本質(zhì)上列荔,dp[i]就相當(dāng)于local敬尺。


另外這題還有一種divide and conquer做法,挺復(fù)雜的先不討論了贴浙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砂吞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崎溃,更是在濱河造成了極大的恐慌蜻直,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袁串,死亡現(xiàn)場(chǎng)離奇詭異概而,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)囱修,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赎瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人破镰,你說(shuō)我怎么就攤上這事餐曼⊙勾ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵晋辆,是天一觀的道長(zhǎng)渠脉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓶佳,這世上最難降的妖魔是什么芋膘? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霸饲,結(jié)果婚禮上为朋,老公的妹妹穿的比我還像新娘。我一直安慰自己厚脉,他們只是感情好习寸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傻工,像睡著了一般霞溪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上中捆,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天鸯匹,我揣著相機(jī)與錄音,去河邊找鬼泄伪。 笑死殴蓬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蟋滴。 我是一名探鬼主播染厅,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼津函!你這毒婦竟也來(lái)了肖粮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尔苦,失蹤者是張志新(化名)和其女友劉穎涩馆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕉堰,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凌净,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屋讶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冰寻。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖皿渗,靈堂內(nèi)的尸體忽然破棺而出斩芭,到底是詐尸還是另有隱情轻腺,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布划乖,位于F島的核電站贬养,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琴庵。R本人自食惡果不足惜误算,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迷殿。 院中可真熱鬧儿礼,春花似錦、人聲如沸庆寺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懦尝。三九已至知纷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陵霉,已是汗流浹背琅轧。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撩匕,地道東北人鹰晨。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓墨叛,卻偏偏與公主長(zhǎng)得像止毕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漠趁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容