題目描述
給定一個整數數組,找出兩個 不重疊 子數組使得它們的和最大。
每個子數組的數字在數組中的位置應該是連續的。
返回最大的和。
樣例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