牛客网-剑指office-最小的k个数

    xiaoxiao2023-10-05  145

    题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路:首先我们很容易的想到的是将数组升序排序,然后取前k个数即可,但是这种方法的时间复杂度为nlog(n)。

    我们可以利用快速排序(Partition)的想法,确定一个有序的位置,在这个位置左边的数都小于这个数,在这个数右边的数都大于这个数。即下面代码中的partsort函数。

    class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { if (input.size() == 0 || k <= 0||input.size() < k) return{}; int s = 0, l = input.size() - 1; int r = partsort(input, s, l); while (r != k - 1) { if (r < k - 1) r=partsort(input, r + 1, l); else r = partsort(input, s, r-1); } vector<int> output(input.begin(), input.begin()+r+1); return output; } int partsort(vector<int>& input, int start,int end){ int begin = start; int last = end; int key = input[end]; while (begin < last) { //左边找到大于基准元素的值 while (begin < last && input[begin] <= key) ++begin; //右边找到小于基准元素的值 while (begin < last && input[last] >= key) --last; swap(input[begin], input[last]); } swap(input[begin], input[end]); return begin; } };
    最新回复(0)