Lintcode 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
这道题目思路目前还不是很清晰,有几个不太懂的地方,需要回顾。
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) { if (nums == null || nums.length == 0) { return null; } int res[] = new int[2]; //为什么有个dummy node就可以包含单个的情况 Pair[] sum = new Pair[nums.length + 1]; sum[0] = new Pair(0, 0); int prev = 0; for (int i = 1; i <= nums.length; i++) { sum[i] = new Pair(i, prev + nums[i - 1]); prev = sum[i].sum; } Arrays.sort(sum, new Comparator<Pair>() { public int compare(Pair a, Pair b) { return a.sum - b.sum; } }); int ans = Integer.MAX_VALUE; for (int i = 1; i <= nums.length; i++) { if (sum[i].sum - sum[i - 1].sum < ans) { ans = sum[i].sum - sum[i - 1].sum; int[] tmp = {sum[i].index - 1, sum[i - 1].index - 1}; Arrays.sort(tmp); //有点不是很明白这里为什么要加上1 res[0] = tmp[0] + 1; res[1] = tmp[1]; } } return res; } } class Pair { int index; int sum; Pair(int index, int sum) { this.index = index; this.sum = sum; } }