剑指offer-第五章优化时间和空间效率(最小的k个数)
2015-08-22 15:14
471 查看
题目:输入n个数,输出最小的k个数。
时间复杂度为O(n)
思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition。但是只要找到前K个最小的元素,并不一定要排好序。
Java代码:
时间复杂度为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); } }
相关文章推荐
- JS实现网页顶部向下滑出的全国城市切换导航效果
- 使用Visual Studio 快速把 Json,Xml 字符串创建为一个实体类
- HTML5 --FileReader实践
- js 实现class作为选择器
- js 中class选择器,addClass,removeClass,hasClass,toggleClass,getByClass
- angularJs自定义指令时的绑定
- Caffe调参相关问题整理
- JS返回上一页并刷新页面,亲测有效
- caffe的输入
- html 标签
- JavaScript中Get/Set访问器
- 前端的“三化”建设{转}
- JS 传播事件、取消事件默认行为、阻止事件传播
- CSS的table的实现,实现表格的单行边框显示,换行显示效果
- js 小说格式整理
- CSS+JS 悬浮固定菜单效果
- js 敏感词过滤
- jQuery.holdReady(hold)的使用简介
- UVA 10537 - The Toll! Revisited(dijstra扩张)
- json 转换,手机获取验证码