源地址
https://app.codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/
MaxDoubleSliceSum(最大雙切片的和)
給定一個含有N個整數的非空數組A.三個數(X, Y, Z), 其中 0 ≤ X < Y < Z < N, 被叫做雙切片.
雙切片(X, Y, Z)的和是A[X + 1] + A[X + 2] + … + A[Y − 1] + A[Y + 1] + A[Y + 2] + … + A[Z − 1]的和.
比如:
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
含有如下示例雙切片:
- (0, 3, 6), 和爲 2 + 6 + 4 + 5 = 17,
- (0, 3, 7), 和爲 2 + 6 + 4 + 5 − 1 = 16,
- (3, 4, 5), 和爲 is 0.
寫一個函數,給定一個含有N個整數的非空數組A,返回最大雙切片的和.
class Solution {
public int solution(int[] A);
}
比如在以上例子中,函數應該返回17.
假定:
- N是範圍在 [3…100,000]的整數
- A中的元素都是範圍在 [−10,000…10,000]的整數
第一步
雙切片(X, Y, Z)的和 就是範圍在X Y之間的數的和,但是去掉X,Y,Z這3個數.
建立兩個數組,分別儲存以Y爲基點,從1到N-1遍歷時,左切片和右切片的合的最大值.
public int solution(int[] A) {
int n = A.length;
int[] maxLeft = new int[n];
int[] maxRight = new int[n];
for (int i = 1; i < n - 1; i++) {
maxLeft[i] = Math.max(maxLeft[i - 1] + A[i], 0);
maxRight[n - i - 1] = Math.max(maxRight[n - i] + A[n - i - 1], 0);
}
int max = 0;
for (int i = 1; i < n - 1; i++) {
max = Math.max(max, maxLeft[i - 1] + maxRight[i + 1]);
}
return max;
}