zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }

  • 相关阅读:
    Zookeeper白话解析
    WireMock简单使用
    mysql通用包安装
    修改mysql密码
    jmeter for循环嵌套if学习2
    jmeter for循环嵌套if学习1
    jmeter Transaction Controller学习
    jmeter ForEach Controller学习
    loadrunner随笔1
    shell中创建mysql库和执行sql脚本
  • 原文地址:https://www.cnblogs.com/ttzz/p/13551020.html
Copyright © 2011-2022 走看看