Step 1. Calculate the prefix sum for each position in the array.
Step 2. Sort the prefix sum array.
Step 3. Compare every prefix sum and distance between two adjacent prefix sum, choose the minimum as diff, and save the start and end indices.
public class Solution {
private class PrefixSum implements Comparable<PrefixSum> {
private int index;
private int sum;
public PrefixSum(int index, int sum) {
this.index = index;
this.sum = sum;
}
public int compareTo(PrefixSum comparePrefixSum) {
return this.sum - comparePrefixSum.sum;
}
}
public int[] subarraySumClosest(int[] nums) {
int[] res = new int[2];
PrefixSum[] prefixSum = new PrefixSum[nums.length];
int sum = 0;
for (int i=0; i<nums.length; i++) {
sum += nums[i];
prefixSum[i] = new PrefixSum(i, sum);
}
Arrays.sort(prefixSum);
int diff = Integer.MAX_VALUE;
for (int i=0; i<prefixSum.length; i++) {
if (Math.abs(prefixSum[i].sum) < diff) {
diff = Math.abs(prefixSum[i].sum);
res[0] = 0;
res[1] = prefixSum[i].index;
}
if (i>0 && Math.abs(prefixSum[i].sum-prefixSum[i-1].sum)<diff) {
diff = Math.abs(prefixSum[i].sum-prefixSum[i-1].sum);
if (prefixSum[i-1].index < prefixSum[i].index) {
res[0] = prefixSum[i-1].index+1;
res[1] = prefixSum[i].index;
} else {
res[1] = prefixSum[i-1].index;
res[0] = prefixSum[i].index+1;
}
}
}
return res;
}
}