【Leetcode】最大子序和

題目:css

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

 

 

分析思路:數組

首先確定是暴力求解法,找到一個可行解。而後進一步對暴力求解法進行優化。函數

暴力求解法經過兩個循環遍歷,找到全部子序,比較全部子序和獲得最大子序和。暴力解法存在不少冗餘的計算。當sum(a_i, a_(i+1), a_(i+2)) <=0 時,那麼以此3項做爲開頭的全部子序均可以剔除,再也不考慮。利用上面這一特性,咱們能夠對暴力解法進行優化,獲得時間複雜度爲O(n)的算法。優化

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxV = nums[0];
        int index = 0;
        
        while(index < nums.size()) {
            int sum = 0;
            
            for(index; index < nums.size(); ++index) {
                sum = sum + nums[index];
                
                maxV = max(maxV, sum);
                
                if(sum <= 0) {
                    index += 1;
                    break;
                }
            }
        }
        return maxV;
    }
};

時間複雜度:O(n)spa

空間複雜度:O(1)3d

 

 

分治法。記最大子序和爲maxResult,函數爲int getMaxSub( *, * ) {}。code

向量A= [a1, a2, a3, ...., ai, ai+1, a+2, ......, aj-1, aj],blog

maxResult = max( maxresult(a1, ......, ai),  getMaxSub(*, i+1) ),其中sum(a1, ......, ai) <= 0.內存

時間複雜度:O(n)

空間複雜度:O(n) ???

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size() == 0)
            return -1;
        
        return getMaxSub(nums, 0);
    }
    
    int getMaxSub(const vector<int>& vecInt, int index) {
        
        int maxR = vecInt[index], sum = 0;
        
        for(index; index < vecInt.size(); ++index) {
            sum = sum + vecInt[index];
            
            if(sum <= 0 && index < (vecInt.size() - 1)) {  // 確保下一級序列非空
                maxR = max(maxR, getMaxSub(vecInt, index+1));
                return maxR;
            }
            else {
                maxR = max(maxR, sum);
            }
        }
        return maxR;
    }
};
執行用時 :12 ms, 在全部 C++ 提交中擊敗了64.15%的用戶
內存消耗 :9.4 MB, 在全部 C++ 提交中擊敗了76.19%的用戶
相關文章
相關標籤/搜索