【leetcode】53. 最大子序和(Maximum Subarray)


題目描述

【leetcode】53. 最大子序和(Maximum Subarray)
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
在這裏插入圖片描述

第一次解答

思路:
暴力法。
遍歷所有可能的組合,起始點i從0開始到nums.size()-1
遍歷從所有起始點開始,到結束點j處的累加和,返回最大的那個。
執行次數=1+2+3+…+n,等差數列,所以O(n^2)

難點:
子序列長度不定

注意:
初始化最大值時注意,最大值不一定是正數

test case:
[-2,1,-3,4,-1,2,1,-5,4]

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // 假定最大值能用int表示,設置max初始值爲-2^31
        int max_sum = -0x80000000;
        printf("max_sum:%d\n",max_sum);
        for(int i=0; i<nums.size(); ++i){
            int sum = 0;
            for(int j=i; j<nums.size(); ++j){
                sum += nums[j];
                if(sum > max_sum){
                    max_sum = sum;
                }
            }
        }
        return max_sum;
    }
};

結果:
在這裏插入圖片描述

第二次解答

仔細觀察解答一,當i爲0時,j往後遍歷,一會會有某個j==j_max時,使得0到j的元素是最大的(在i爲0的前提下),那麼j在j_max後繼續往後遍歷只會使得和越來越小,換句話來說在j_max到nums.size()-1的元素和是小於等於0的。
這意味着什麼呢?意味着我們已經找到了使得子序列和最大的下標j,正是j_max。剩下的一步就是確定子序列的開始下標i是多少了。於是我改進解答一。

相關/參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章