剑指offer 29 最小的k个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。


思路

1.先排序,然后直接输出前面需要的最小的数。时间复杂度为O(nlogn)

2.冒泡排序,直接冒泡遍历k次。时间复杂度为O(kn)

3.快速排序,由于快速排序是先选择一个数,然后将小于这个数的数放在左边,大的数放在右边,所以通过快速排序中的局部操作确定前面k个数,然后再对这k个数进行排序。时间复杂度为O(n+klogk)

4.用一个容量为k的优先队列,如果该队列不满,那么就加入这个数,如果队列满了,那么就判断这个数是不是小于队列中的最大值,如果是的,那么就弹出最大值,并压入这个较小的数。时间复杂度为O(nlogk),优先队列中的插入和删除操作的时间复杂度都是logn的。

我写的只是简单的冒泡排序。

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
         vector<int>temp;
        if(input.size()<k)return temp;
        for(int ii=0;ii<k;ii++){
            for(int jj=0;jj<input.size()-1;jj++){
                if(input[jj]<input[jj+1]){
                    swap(input[jj],input[jj+1]);
                }
            }
        }
       int uu=input.size()-k;
        for(int ii=input.size()-1;ii>=uu;ii--){
            temp.push_back(input[ii]);
        }
        return temp;
    }
};


你可能感兴趣的:(剑指offer 29 最小的k个数)