描述
给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最右一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置
您在真实的面试中是否遇到过这个题? 是
样例
给出[-3, 1, 1, -3, 5],返回[0, 2],[1, 3], [1, 1], [2, 2] 或者 [0, 4]。
挑战
O(nlogn)的时间复杂度
分析:
定义一个pair结构有两个成员变量 sum和 index,表示的是数组前index项之和为sum。遍历数组得到长度为nums.length+1的pair数组,其中pairs[0]表示的是前0项之和为0。按照pairs的sum进行升序排序,变量ans保存前i项之和减去前j项之和的最小值,那么前i项的最后一个值的下标为i-1,因为下标从0开始。所以子数组的头应为i-1+1,尾为j-1。
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{ //前index个数之和为sum
int sum;
int index;
public pair(int sum,int index){
this.sum=sum;
this.index=index;
}
}
public int[] subarraySumClosest(int[] nums) {
int[] res=new int[2];
if(nums==null || nums.length==0) return res;
if(nums.length==1){
res[0]=res[1]=0;
return res;
}
pair[] pairs=new pair[nums.length+1];
pairs[0]=new pair(0,0); //表示前0项之和为0;
for(int i=1;i<=nums.length;i++){
pairs[i]=new pair(nums[i-1]+pairs[i-1].sum,i);
}
Arrays.sort(pairs, new Comparator<pair>() { //按照pairs.sum升序
@Override
public int compare(pair o1, pair o2) {
return o1.sum-o2.sum;
}
});
int ans=Integer.MAX_VALUE;
for(int i=1;i<=nums.length;i++){
if(ans>pairs[i].sum-pairs[i-1].sum){
ans=pairs[i].sum-pairs[i-1].sum;
int[] temp=new int[]{pairs[i-1].index-1,pairs[i].index-1}; //index-1表示的是前index项之和的最后一个数
Arrays.sort(temp);
res[0]=temp[0]+1;
res[1]=temp[1];
}
}
return res;
}
}

606

被折叠的 条评论
为什么被折叠?



