最接近零的子数组和
题目:
描述
给定一个整数数组,找到一个和最接近于零的子数组。返回满足要求的子数组的起始位置和结束位置。
样例
样例1
输入:
[-3,1,1,-3,5]
输出:
[0,2]
解释: [0,2], [1,3], [1,1], [2,2], [0,4]
public class Solution {
class Pair {
int sum;
int index;
public Pair(int s, int i) {
sum = s;
index = i;
}
}
/*
* @param nums: A list of integers
* @return: A list of integers includes the index of the first number and the index of the last number
*/
public int[] subarraySumClosest(int[] nums) {
// write your code here
int[] res = new int[2];
if (nums == null || nums.length == 0) {
return res;
}
int len = nums.length;
if(len == 1) {
res[0] = res[1] = 0;
return res;
}
Pair[] sums = new Pair[len + 1];
int prev = 0;
sums[0] = new Pair(0, 0);
for (int i = 1; i <= len; i++) {
sums[i] = new Pair(sums[i - 1].sum + nums[i - 1], i);
}
Arrays.sort(sums, (a, b) -> {
return a.sum - b.sum;
});
int ans = Integer.MAX_VALUE;
for (int i = 1; i <= len; i++) {
if (ans > sums[i].sum - sums[i - 1].sum) {
ans = sums[i].sum - sums[i - 1].sum;
int[] temp = new int[]{sums[i].index - 1, sums[i - 1].index - 1};
Arrays.sort(temp);
// res[0] = temp[0] + 1 是因为
// sums[i].sum - sums[i - 1].sum 实际上是
// nums[(sums[i - 1].index - 1 + 1)] ~ nums[(sums[i].index - 1)]的和
res[0] = temp[0] + 1;
res[1] = temp[1];
}
}
return res;
}
}