给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的值。
如果多个答案,请返回其中任意一个。
取反法
假设不循环
求出最大值 与402题做法相同
求出最小值 用数组元素和减去最小值 即为可以循环条件下的最大值
两者中的最大值即为答案
public class Solution {
/*
* @param A: An integer array
* @return: A list of integers includes the index of the first number and the index of the last number
*/
public List<Integer> continuousSubarraySumII(int[] A) {
List<Integer> list = new ArrayList<>();
if(A == null || A.length == 0)
return list;
list.add(0);
list.add(0);
int sum = 0;
for(int i = 0; i < A.length; i++){
sum += A[i];
}
int maxsum = 0, minsum = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int start1 = 0, end1 = 0;
int start2 = 0, end2 = 0;
for(int i = 0; i < A.length; i++){
if(maxsum < 0){
maxsum = A[i];
start1 = end1 = i;
}
else{
maxsum += A[i];
end1 = i;
}
if(maxsum > max && maxsum > sum - min){
max = maxsum;
list.set(0, start1);
list.set(1, end1);
}
if(minsum > 0){
minsum = A[i];
start2 = end2 = i;
}
else{
minsum += A[i];
end2 = i;
}
if(i != A.length - 1 && minsum < min && sum - minsum > max){
min = minsum;
list.set(0, end2 + 1);
list.set(1, start2 - 1);
}
}
return list;
}
}