Description:
给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最有一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置
Explanation:
给出[-3, 1, 1, -3, 5]
,返回[0, 2]
,[1, 3]
, [1, 1]
, [2, 2]
或者 [0, 4]
。
Solution:
首先想到了遍历所有组合,但是超时了。然后借助定义新的类Pair存储和及序号。
将数组元素依次相加求和,并连同最后一位的index存入pair[]中。然后将pair[]按照sum的大小进行排序(从大到小)那么排序后相邻的两个sum值得差越小,说明从index1到index2之间元素的和越接近0。注意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 s , int i){
this.index = i;
this.sum = s;
}
}
public int[] subarraySumClosest(int[] nums) {
// write your code here
int[] result = new int[]{0 , 0};
if(nums == null || nums.length == 0 || nums.length == 1){
return result;
}
int len = nums.length;
Pair[] record = new Pair[len + 1];
record[0] = new Pair(0 , 0);
int prev = 0;
for(int i = 1; i< len + 1;i++){
prev += nums[i - 1];
record[i] = new Pair(prev , i);
}
Arrays.sort(record , new Comparator<Pair>(){
public int compare(Pair a , Pair b){
return a.sum - b.sum;
}
});
int min = Integer.MAX_VALUE;
for(int i = 1;i<len + 1;i++){
if(min > record[i].sum - record[i - 1].sum){
min = record[i].sum - record[i - 1].sum;
result[0] = Math.min(record[i].index , record[i - 1].index);
result[1] = Math.max(record[i].index , record[i - 1].index) - 1;
}
}
return result;
}
}