Subarray Sum Closest(最接近零的子数组和)

http://www.lintcode.com/en/problem/subarray-sum-closest/?rand=true
请参阅 内容有序的集合之 TreeMap

import java.util.Arrays;
import java.util.Iterator;
import java.util.TreeMap;

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) {
       // write your code here
       TreeMap treeMap = new TreeMap<>();
//        用来存储从0到i的和,value是i.
//        TreeMap自动实现排序,
//        两个和的差恰好是一个子数组的和,当它们相近时,差会更小。
//        最后要注意返回的时候要把小的那个角标加1,不包含它
       int sum = 0;
       for (int i = 0; i < nums.length; i++) {
           sum += nums[i];
           if (treeMap.containsKey(sum)) {
//                如果找到相等,说明从那个节点到这个节点中间的和为0,直接返回
               return new int[]{treeMap.get(sum) + 1, i};
           } else if (sum == 0) {
//                如果和为0,说明从0到这个节点和最小,直接返回
               return new int[]{0, i};
           } else {
               treeMap.put(sum, i);
           }
       }
       int min = Integer.MAX_VALUE;
       int[] res = new int[2];
       Iterator iterator = treeMap.keySet().iterator();
       Integer pre = null;
       while (iterator.hasNext()) {
           int temp = iterator.next();
           sum = temp;
           if (pre != null) {
//                遍历map,两个相近的作差可能最小,记下来
               sum -= pre;
               sum = Math.abs(sum);
               if (sum < min) {
                   min = sum;
                   res[0] = treeMap.get(pre);
                   res[1] = treeMap.get(temp);
               }
           }
           pre = temp;
       }
//        节点的顺序可能不对,排序,然后小的加1
       if (res[0] != res[1]) {
           Arrays.sort(res);
           res[0] += 1;
       }
       return res;
   }
}

你可能感兴趣的:(Subarray Sum Closest(最接近零的子数组和))