首页 > 代码库 > Subarray Sum Closest
Subarray Sum Closest
Question
Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.
Given [-3, 1, 1, -3, 5]
, return [0, 2]
, [1, 3]
,[1, 1]
, [2, 2]
or [0, 4]
.
Answer
这道题延续Subarray Sum的思路,即将[0, i]的sum存起来。这里构造了一个新的类,Pair。一方面存sum值,一方面存index。然后根据sum值排序,算相邻sum值的差值。差值最小的即为结果。时间复杂度是O(nlogn),空间复杂度是O(n)。
注意:假设[0-2]和[0-4]的sum值的差值最小,那么结果为index[3,4]
1 public class Solution { 2 3 class Pair { 4 public int sum; 5 public int index; 6 public Pair(int sum, int index) { 7 this.sum = sum; 8 this.index = index; 9 } 10 } 11 /** 12 * @param nums: A list of integers 13 * @return: A list of integers includes the index of the first number 14 * and the index of the last number 15 */ 16 public int[] subarraySumClosest(int[] nums) { 17 // write your code here 18 int[] result = new int[2]; 19 if (nums == null || nums.length == 0) { 20 return result; 21 } 22 int len = nums.length; 23 int sum = 0; 24 List<Pair> list = new ArrayList<Pair>(); 25 for (int i = 0; i < len; i++) { 26 sum += nums[i]; 27 Pair tmp = new Pair(sum, i); 28 list.add(tmp); 29 } 30 Collections.sort(list, new Comparator<Pair>() { 31 public int compare(Pair a, Pair b) { 32 return (a.sum - b.sum); 33 } 34 }); 35 int min = Integer.MAX_VALUE; 36 for (int i = 1; i < len; i++) { 37 int diff = list.get(i).sum - list.get(i - 1).sum; 38 if (diff < min) { 39 min = diff; 40 int index1 = list.get(i).index; 41 int index2 = list.get(i - 1).index; 42 if (index1 < index2) { 43 result[0] = index1 + 1; 44 result[1] = index2; 45 } else { 46 result[0] = index2 + 1; 47 result[1] = index1; 48 } 49 } 50 } 51 return result; 52 } 53 }
Subarray Sum Closest
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。