zoukankan      html  css  js  c++  java
  • 剑指offer-最小的k个数

    题目描述

    输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
     
    最下topk,使用大顶堆
        public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
            ArrayList<Integer> re = new ArrayList<Integer>();
            if(input == null || input.length<k ||k==0){//判断非法
                return re;
            }
            int[] heap = new int[k];//new一个堆空间
            for(int i=0;i<k;i++){
                heap[i] = input[i];
            }
            for(int i = k/2;i>=0;i--){//调整大顶堆
                adjustHeap(heap,i,k-1);
            }
            for(int i = k;i<input.length;i++){//对第k个以后的数,如果小于堆顶元素就和堆顶替换,否则不进行任何操作
                if(input[i]<heap[0]){
                    heap[0] = input[i];
                    adjustHeap(heap,0,k-1);
                }
            }
            for(int i = 0;i<k;i++){
                re.add(heap[i]);
            }
            return re;
        }
        public void adjustHeap(int[] heap,int left ,int right){//调整大顶堆
            int target = heap[left];
            for(int i=left*2+1;i<=right;i=i*2+1){
                if(i<right&&heap[i]<heap[i+1]){
                    i++;
                }
                if(heap[i]<=target){
                    break;
                }
                heap[left] = heap[i];
                left =i;
            }
            heap[left] =target;
        }
  • 相关阅读:
    python 操作mysql
    python多线程
    python socket 网络编程
    nginx源码编译安装
    CentOS网卡配置文件
    使用本地yum源
    ping github 请求超时
    ping github 请求超时
    设计模式-装饰器模式
    设计模式-装饰器模式
  • 原文地址:https://www.cnblogs.com/zhacai/p/11019690.html
Copyright © 2011-2022 走看看