题目描述

输入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;
    }
}

 

 

 

 

 

 

posted on 2020-08-23 22:05  曹婷婷  阅读(156)  评论(0编辑  收藏  举报