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;
    }
}

 

posted @ 2017-01-09 06:19  璨璨要好好学习  阅读(128)  评论(0编辑  收藏  举报