算法 中等 | 42. 最大子數組 II

算法 中等 | 42. 最大子數組 II

題目描述

給定一個整數數組,找出兩個 不重疊 子數組使得它們的和最大。
每個子數組的數字在數組中的位置應該是連續的。
返回最大的和。

樣例1

輸入:
[1, 3, -1, 2, -1, 2]
輸出:
7
解釋:
最大的子數組爲 [1, 3][2, -1, 2] 或者 [1, 3, -1, 2][2].

樣例2

輸入:
[5,4]
輸出:
9
解釋:
最大的子數組爲 [5][4].

java題解

public class Solution {
    public int maxTwoSubArrays(ArrayList<Integer> nums) {
        int size = nums.size();
        int[] left = new int[size];
        int[] right = new int[size];
        int sum = 0;
        int minSum = 0;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < size; i++){
            sum += nums.get(i);
            max = Math.max(max, sum - minSum);
            minSum = Math.min(sum, minSum);
            left[i] = max;
        }
        sum = 0;
        minSum = 0;
        max = Integer.MIN_VALUE;
        for(int i = size - 1; i >= 0; i--){
            sum += nums.get(i);
            max = Math.max(max, sum - minSum);
            minSum = Math.min(sum, minSum);
            right[i] = max;
        }
        max = Integer.MIN_VALUE;
        for(int i = 0; i < size - 1; i++){
            max = Math.max(max, left[i] + right[i + 1]);
        }
        return max;
    }
}

C++題解

using namespace std;

class Solution {
public:
    int maxTwoSubArrays(vector<int> &nums) {
        if (nums.size() == 0) {
            return 0;
        }
        
        int result = -2147483648;
        int n = (int)nums.size();
        vector<int> maxLeft(n + 1, -2147483648);
        vector<int> maxRight(n + 1, -2147483648);
        vector<int> profit(n + 1, 0);
        
        vector<int> sum(n + 1, 0);
        
        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + nums[i - 1];
        }
        
        maxLeft[0] = -2147483648;
        for (int i = 1, valley = 0; i < sum.size(); i++) {            
            maxLeft[i] = max(maxLeft[i - 1], sum[i] - valley);
            valley = min(valley, sum[i]);
        }
        
        
        for (int i = n, peak = sum[n]; i > 0; i--) {
            if (i == n) {
                maxRight[i] = peak - sum[i - 1];
            } else {
                maxRight[i]= max(maxRight[i + 1], peak - sum[i - 1]);
            }
            peak = max(peak, sum[i - 1]);
        }
        
        for (int i = 1; i < n; i++) {
            profit[i] = maxLeft[i] + maxRight[i + 1];
            result = max(result, profit[i]);
        }
        
        return result;
    }
};

python題解

class Solution:
    def maxTwoSubArrays(self, nums):
        n = len(nums)
        a = nums[:]
        aa = nums[:]
        for i in range(1, n):
            a[i] = max(nums[i], a[i-1] + nums[i])
            aa[i] = max(a[i], aa[i-1])
        b = nums[:]
    	bb = nums[:]
        for i in range(n-2, -1, -1):
            b[i] = max(b[i+1] + nums[i], nums[i])
            bb[i] = max(b[i], bb[i+1])
        mx = -65535
        for i in range(n - 1):
            mx = max(aa[i]+b[i+1], mx)

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