LeetCode53 | 最大子序和

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

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6

解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。


     求最大子數組的方法,可以參考這一篇文章,講了三種方法:遞歸與分治 / 序列DP | 最大子數組問題

     我採用的是簡單的分治算法,ac代碼如下:

#include <algorithm>
using namespace std;

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        return findMaxSubarray(nums, 0, nums.size() - 1);
    }

    int findMaxSubarray(vector<int>& a, int s, int e) {
        if(s == e)  //遞歸的終點
            return a[s];

        int mid = (s + e) / 2;

        int leftAns = findMaxSubarray(a, s, mid);  //計算含mid的左側答案
        int rightAns = findMaxSubarray(a, mid + 1, e);  //計算不含mid的右側答案
        int midAns = findMAxCrossingSubarray(a, s, mid, e);  //計算含mid的答案
        
        return max(midAns, max(leftAns, rightAns));
    }

    /* 在數組a[l,r]內找到包含m下標位置的最大子數組 */
    int findMAxCrossingSubarray(vector<int>& a, int l, int mid, int r) {
        //左邊
        int leftMax = a[mid], cur = a[mid];
        for(int i = mid - 1; i >= l; i--) {
            cur += a[i];
            leftMax = max(cur, leftMax);   //更新最大答案
        }
        //右邊
        int rightMax = a[mid];
        cur = a[mid];
        for(int i = mid + 1; i <= r; i++) {
            cur += a[i];
            rightMax = max(cur, rightMax);
        }

        return leftMax + rightMax - a[mid];
    }
    
};

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