Subarray Sum Closest

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


發佈了187 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章