最小的K个数(NC119/考察次数Top5/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小的K个数(NC119/考察次数Top5/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组。
示例1
输入:
[4,5,1,6,2,7,3,8],4
返回值:
[1,2,3,4]
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        
//         //思路1,先使用库函数sort进行排序,然后进行求解
//         vector<int> res;
//         if(k<=0 || k>input.size())             //异常边境情况
//             return res;
//         sort(input.begin(), input.end());      //使用库函数进行排序
//         for(int i=0; i<k; ++i)
//         {
//             res.push_back(input[i]);           //求出结果
//         }
//         return res;
        
        
        
        //思路2,使用快排加二分法(二分的目的主要是没必要排没有意义的一侧了)
        vector<int> res;
        if(k<=0 || k>input.size())         //异常边境情况
            return res;
        quicksort(input, 0, n-1, k);       //输入的数组,左边界,右边界,以及最小的k个数的k值
        vector<int> res;
        for(int i = 0; i<k; ++i)
        {
            res.push_back(input[i]);
        }
        return res;
    }
    
    //快排填坑法,注意是输入的数组的引用(因为有变动)
    void quicksort(vector<int> &input, int left, int right, int k)
    {
        if(left >= right)                        //递归结束条件
            return;
        int i = left;
        int j = right;
        int temp = input[i];                     //挖出坑
        while(i<j)                               //一直填坑,直到靠拢(i=j);
        {
            while(i<j && input[j]>=temp)
                j--;
            input[i] = input[j];
            while(i<j && input[i]<=temp)
                i++;
            input[j]=input[i];
        }
        input[i]=temp;                           //把temp值赋i和j相遇时的坑位
        if(i>=k)                                 //i在比较靠后的位置,则排序前一半即可
        {
            quicksort(input, left, i-1, k);
        }else{                                   //否则两边都需要quicksort
            quicksort(input, left, i-1, k);
            quicksort(input, i+1, right, k);
        }
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于最小的K个数(NC119/考察次数Top5/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

缺失数字(NC101/考察次数Top60/难度简单)

矩阵的最小路径和(NC59/考察次数Top47/难度中等)

NC119 最小的K个数

寻找第K大(NC88/考察次数Top7/难度中等)

最小编辑代价(NC35/考察次数Top52/难度较难)

合并k个已排序的链表(NC51/考察次数Top37/难度较难)