Subarray Sum Closest

lc 139 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

注意 与subarray sum对比来看。我们都是加入了一个-1的point来辅助运算。另外注意两个和的差值之间,本身在数组index比较小的是前一个prefixsum, 所以是start, 然后index都是index+1,大的那一个是结束点,index是本身

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
     */
    class Pair {
        int sum;
        int index;
        public Pair(int sum, int index) {
            this.sum = sum;
            this.index = index;
        }
    }
    public int[] subarraySumClosest(int[] nums) {
        // write your code here
        int[] res = new int[2];
        if (nums == null || nums.length == 0) return res;
        Pair[] pairs = new Pair[nums.length + 1];
        int sum = 0;
        pairs[0] = new Pair(0, -1);
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            pairs[i + 1] = new Pair(sum, i);
        }
        Arrays.sort(pairs, new Comparator<Pair>(){
            public int compare(Pair a, Pair b) {
                if (a.sum  == b.sum) {
                    return a.index - b.index;
                }
                return a.sum - b.sum;
            }
        });
        int minValue = Integer.MAX_VALUE;

        for (int i = 1; i < pairs.length; i++) {
            int curDiff = Math.abs(pairs[i].sum - pairs[i-1].sum);
            if (curDiff <= minValue) {
                minValue = curDiff;
                res[0] = Math.min(pairs[i-1].index, pairs[i].index) + 1;
                res[1] = Math.max(pairs[i-1].index, pairs[i].index);
            }
        }
        return res;
    }
}

results matching ""

    No results matching ""