Subarray Sum Closest

来源:互联网 发布:淘宝商标上传 编辑:程序博客网 时间:2024/05/20 17:24

Step 1. Calculate the prefix sum for each position in the array.

Step 2. Sort the prefix sum array.

Step 3. Compare every prefix sum and distance between two adjacent prefix sum, choose the minimum as diff, and save the start and end indices.

public class Solution {     private class PrefixSum implements Comparable<PrefixSum> {         private int index;         private int sum;                  public PrefixSum(int index, int sum) {             this.index = index;             this.sum = sum;         }                  public int compareTo(PrefixSum comparePrefixSum) {             return this.sum - comparePrefixSum.sum;         }     }         public int[] subarraySumClosest(int[] nums) {        int[] res = new int[2];        PrefixSum[] prefixSum = new PrefixSum[nums.length];                int sum = 0;        for (int i=0; i<nums.length; i++) {            sum += nums[i];            prefixSum[i] = new PrefixSum(i, sum);        }                Arrays.sort(prefixSum);                int diff = Integer.MAX_VALUE;                for (int i=0; i<prefixSum.length; i++) {            if (Math.abs(prefixSum[i].sum) < diff) {                diff = Math.abs(prefixSum[i].sum);                res[0] = 0;                res[1] = prefixSum[i].index;            }            if (i>0 && Math.abs(prefixSum[i].sum-prefixSum[i-1].sum)<diff) {                diff = Math.abs(prefixSum[i].sum-prefixSum[i-1].sum);                if (prefixSum[i-1].index < prefixSum[i].index) {                    res[0] = prefixSum[i-1].index+1;                    res[1] = prefixSum[i].index;                } else {                    res[1] = prefixSum[i-1].index;                    res[0] = prefixSum[i].index+1;                }            }        }                return res;    }}


0 0
原创粉丝点击