139 - Subarray Sum Closest
Written on October 21, 2015
Tweet
Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.
public class Solution {
class pair {
int sum, index;
public pair(int sum, int index) {
this.sum = sum;
this.index = index;
}
}
public int[] subarraySumClosest(int[] nums) {
if (nums == null || nums.length == 0) return new int[] {};
pair[] pairs = new pair[nums.length + 1];
pairs[0] = new pair(0, 0);
for (int i = 1; i <= nums.length; i++) {
pairs[i] = new pair(pairs[i-1].sum + nums[i - 1], i);
}
Arrays.sort(pairs, new Comparator<pair>() {
public int compare(pair a, pair b) {
return a.sum - b.sum;
}
});
int diff = Integer.MAX_VALUE, start = 0, end = 0;
for (int i = 1; i < pairs.length; i++) {
//after sorting, the min distance must be within neighbors
if (diff > pairs[i].sum - pairs[i - 1].sum) {
diff = pairs[i].sum - pairs[i - 1].sum;
start = Math.min(pairs[i].index, pairs[i-1].index);
end = Math.max(pairs[i].index, pairs[i-1].index) - 1;
}
}
return new int[] {start, end};
}
}
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
"""
def subarraySumClosest(self, nums):
# write your code here
if not nums:
return []
sum_list = [[0, 0]]
for i, num in enumerate(nums):
curr_sum = sum_list[-1][0] + num
sum_list.append([curr_sum, i + 1])
sum_list.sort(key=lambda x : x[0])
min_sum = 2 ** 31 - 1
start = end = 0
for i in xrange(1, len(sum_list)):
diff = sum_list[i][0] - sum_list[i - 1][0]
if min_sum > diff:
start = min(sum_list[i - 1][1], sum_list[i][1])
end = max(sum_list[i - 1][1], sum_list[i][1]) - 1
min_sum = diff
return [start, end]