天天看點

【leetcode】53. 最大子序和(Maximum Subarray)相關/參考連結

題目描述

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

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

【leetcode】53. 最大子序和(Maximum Subarray)相關/參考連結

第一次解答

思路:

暴力法。

周遊所有可能的組合,起始點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;
    }
};
           

結果:

【leetcode】53. 最大子序和(Maximum Subarray)相關/參考連結

第二次解答

仔細觀察解答一,當i為0時,j往後周遊,一會會有某個j==j_max時,使得0到j的元素是最大的(在i為0的前提下),那麼j在j_max後繼續往後周遊隻會使得和越來越小,換句話來說在j_max到nums.size()-1的元素和是小于等于0的。

這意味着什麼呢?意味着我們已經找到了使得子序列和最大的下标j,正是j_max。剩下的一步就是确定子序列的開始下标i是多少了。于是我改進解答一。

相關/參考連結