环形数组 意味着数组的末端将会与开头相连呈环状。例如,
数据范围:
[6,-3,6]
12
从子数组 [6,6] 得到最大和 6 + 6 = 12
[4,-2,2,-4]
4
从子数组 [4] 和 [4,-2,2] 都可以得到最大和 4
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型ArrayList
* @return int整型
*/
public int maxSubarraySumCircular (ArrayList<Integer> nums) {
// write code here
int sum = 0;
int max = nums.get(0);
int prev = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums.get(i); //顺便计算数组总和
prev = Math.max(prev + nums.get(i), nums.get(i));
max = Math.max(max, prev);
}
prev = 0;
int min = nums.get(0);
for (int i = 0; i < nums.size(); i++) {
prev = Math.min(prev + nums.get(i), nums.get(i));
min = Math.min(min, prev);
}
if (sum != min) {
max = Math.max(max, sum - min);
}
return max; //当最小子数组为整个数组时,sum-min会导致结果为0,因此这种情况就无需比较max和sum-min,直接返回max即可
}
}