问题: 给定一维整型数组和一个整数K,找出和不小于K的数目最少的子数组。
思路: 改进快排分区思路(见Top K)。对数组进行降序排列,分区同时计算左边数之和。
java代码:
int partitionTwo(int[] data,int start,int end,ArrayList<Integer> currSum){
if(start>end)
return -1;
int sum=0;
int index=start;
int tmp=data[index];
data[index]=data[end];
for(int i=start;i<end;i++){
if(data[i]>=data[end]){
if(i!=index){
tmp=data[index];
data[index]=data[i];
data[i]=tmp;
}
index++;
}
}
tmp=data[end];
data[end]=data[index];
data[index]=tmp;
for(int i=0;i<index;i++){
sum+=data[i];
}
currSum.set(0,sum);
return index;
}
void getTopKII(int[] data,int k){
int start=0,end=data.length-1;
int last=-1;
ArrayList<Integer> currSum=new ArrayList<Integer>();
int index=partitionTwo(data,start,end,currSum);
while(index>=0){
if(currSum.get(0)>=k){
last=index;
end=index-1;
index=partitionTwo(data,start,end,currSum);
}
else{
start=index+1;
k=k-currSum.get(0);
index=partitionTwo(data,start,end,currSum);
}
}
for(int i=0;i<last;i++){
System.out.println(data[i]+"\t");
}
}