面试题 17.14. 最小K个数分治法

Posted 这是一个很随便的名字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 17.14. 最小K个数分治法相关的知识,希望对你有一定的参考价值。

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:

0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))

class Solution {
public:
    void quick_find(vector<int>& arr,int l,int r, int k)
    {
        if(l>=r) return;
        int ll = l, rr = r, t = arr[l];
        while(ll<rr)
        {
            while(ll<rr&&arr[rr]>=t) rr--;
            swap(arr[ll],arr[rr]);
            while(ll<rr&&arr[ll]<=t) ll++;
            swap(arr[ll],arr[rr]);
        }
        if(ll>=k){
            quick_find(arr, l, ll, k);
        }
        else{
            quick_find(arr, ll+1, r, k);
        }
    }
    vector<int> smallestK(vector<int>& arr, int k) {
        //分治法,类似快排的思想
        quick_find(arr,0,arr.size()-1,k);
        vector<int> ret;
        ret.assign(arr.begin(),arr.begin()+k);
        return ret;
    }
};

以上是关于面试题 17.14. 最小K个数分治法的主要内容,如果未能解决你的问题,请参考以下文章

面试题 17.14. 最小K个数

面试题 17.14. 最小K个数

Leetcode刷题100天—面试题 17.14. 最小K个数(优先队列)—day27

Leetcode刷题100天—面试题 17.14. 最小K个数(优先队列)—day27

C++&Python描述 LeetCode 面试题 17.14. 最小K个数

LeetCode 面试题 17.14. 最小K个数(堆排,快排)/剑指 Offer 10- I. 斐波那契数列 /470. 用 Rand7() 实现 Rand10()(拒绝采样,学!!!)