- Subarray Sum Closest
Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.
Example
Given [-3, 1, 1, -3, 5], return [0, 2], [1, 3], [1, 1], [2, 2] or [0, 4].
Challenge
O(nlogn) time
class Pair{
int sum;
int index;
public Pair(int a, int b){
this.sum = a;
this.index = b;
}
}
public class Solution {
/*
* @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];
Pair[] sums = new Pair[nums.length + 1];
sums[0] = new Pair(0, -1);
int prev = 0;
for(int i = 0; i < nums.length; i++){
sums[i+1] = new Pair(prev + nums[i], i);
prev = sums[i+1].sum;
}
Arrays.sort(sums, new Comparator<Pair>(){
public int compare(Pair a, Pair b){
return a.sum - b.sum;
}
});
int ans = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i++){
int temp = sums[i+1].sum - sums[i].sum;
if(ans > temp){
ans = temp;
if(sums[i].index < sums[i+1].index){
res[0] = sums[i].index + 1;
res[1] = sums[i+1].index;
}else{
res[1] = sums[i].index;
res[0] = sums[i+1].index + 1;
}
}
}
return res;
}
}