zoukankan      html  css  js  c++  java
  • 剑指offer-第五章优化时间和空间效率(最小的k个数)

    题目:输入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);
    	}
    }
    
  • 相关阅读:
    【oracle】约束之非空约束
    【oracle】操作表数据之修改和删除
    【oracle】操作表中的数据之添加
    HashMap和HashTable的比较
    java集合类-总纲
    性能测试工具篇(开源&商业)
    比较好的idea工具介绍
    根据mysql某一条记录生成对应实体类的初始化
    Spring+mybatis多数据源切换笔记
    Jmeter的Throughput和平均响应时间计算方法整理
  • 原文地址:https://www.cnblogs.com/hupp/p/4750311.html
Copyright © 2011-2022 走看看