• 剑指offer(29):最小的K个数(pop_heap函数的使用)


    题目描述

    输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
    直接排序:
    class Solution {
    public:
        static bool cmp(int a,int b){return a>b;}
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> result;
            int len = input.size();
            if(len==0||k>len) return result;
            sort(input.begin(), input.end());
            for(int i=0;i<k;i++)
                result.push_back(input[i]);
            return result;
        }
    };
     简单算法:简单选择排序,时间复杂度O(n^2)
    class Solution {
    public:
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> result;
            if(input.size()==0||k>input.size()) return result;
            int minIndex;
            int len = input.size();
            int temp;
            int count=0;
            for(int i=0;i<len,count<k;i++){
                minIndex = i;
                count++;
                for(int j=i+1;j<len;j++){
                    if(input[minIndex] > input[j])
                        minIndex = j;
                }
                if(minIndex != i){
                    swap(input[i],input[minIndex]);//STL库函数
                }
                result.push_back(input[i]);
            }
            return result;
        }
    };

     使用堆排序:

    C++实现:使用了STL库的pop_heap函数

    class Solution {
    public:
        static bool cmp(int a,int b){
            return a>b;
        }
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> result;
            int len = input.size();
            if(len==0||k>len) return result;
            int arr[len];
            std::copy(input.begin(), input.end(), arr);
            make_heap(&arr[0], &arr[len],cmp);
            for(int i=0;i<k;i++){
                pop_heap(&arr[0], &arr[len-i],cmp);
                result.push_back(arr[len-1-i]);
            }
            return result;
        }
    };

     C++使用优先级队列实现:

    class Solution {
    public:
        static bool cmp(int a,int b){return a>b;}
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> result;
            int len = input.size();
            if(len==0||k>len) return result;
            priority_queue<int,vector<int>,greater<int>> p;//注意这里是数字约小优先级越高
            for(int i=0;i<len;i++){
                p.push(input[i]);
            }
            for(int i=0;i<k;i++){
                result.push_back(p.top());
                p.pop();
            }
            return result;
        }
    };

     java优先级队列实现:

    import java.util.*;
    public class Solution {
        public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
            ArrayList<Integer> in = new ArrayList<Integer>();
            int len = input.length;
            if(len==0||k>len) return in;
            PriorityQueue<Integer> p = new PriorityQueue<Integer>(
                new Comparator<Integer>(){
                public int compare(Integer o1,Integer o2){
                    return o1.compareTo(o2);
                }
            });
            
            for(int i=0;i<len;i++){
                p.add(input[i]);
            }
            for(int i=0;i<k;i++){
                in.add(p.poll());
            }
            return in;
        }
    }

  • 相关阅读:
    面向对象高级
    Intellij IDEA 激活码 | Intellij IDEA 注册码
    如何保证核心链路稳定性的流控和熔断机制?
    消息模型:主题和队列有什么区别?
    MySQL中悲观锁和乐观锁到底是什么?
    SQL是如何在数据库中执行的?
    ZooKeeper 面试题(30道ATM精选问题)
    线上服务的FGC问题排查,看这篇就够了!
    一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
    由多线程内存溢出产生的实战分析
  • 原文地址:https://www.cnblogs.com/ttzz/p/13551020.html
Copyright © 2020-2023  润新知