您的位置:首页 > Web前端

剑指offer-第五章优化时间和空间效率(最小的k个数)

2015-08-22 15:14 471 查看
题目:输入n个数,输出最小的k个数。

时间复杂度为O(n)

思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition。但是只要找到前K个最小的元素,并不一定要排好序。

Java代码:

import java.util.Random;

//时间复杂度为O(n);
public class PreKOfArray {
//一趟快速排序
public int partition(int[] a,int start,int end){
if(a==null)
return -1;
Random rand=new Random();
int index=start+rand.nextInt(end-start);
swrap(a,index,end);
int small=start-1;
for(index=start;index<a.length;index++){
if(a[index]<a[end]){
small++;
if(small!=index)
swrap(a,index,small);
}

}
small++;
swrap(a,small,end);
return small;
}

public  void swrap(int[] a, int index, int end) {
int temp=a[index];
a[index]=a[end];
a[end]=temp;
}
public void printMinKOfArray(int[] input,int[] output,int k){
if(input==null||output==null||k>input.length||k<=0)
return;
int start=0;
int end=input.length-1;
int index=partition(input,start,end);
//找到前k个最小的数字
while(index!=k-1){
if(index>k-1){
end=index-1;
index=partition(input,start,end);
}
else{
start=index+1;
index=partition(input,start,end);
}
}

for(int i=0;i<k;i++){
output[i]=input[i];
}

for(int z:output)
System.out.println(z+",");

}
public static void main(String[] args){
int[] a={2,3,1,4,9,0,5,6,7,8};
int k=5;
int[] b=new int[k];
PreKOfArray poa=new PreKOfArray();
poa.printMinKOfArray(a, b, 5);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: