跟着姚桑学算法-最小的k个数

简介: 剑指offer算法

题. 最小的k个数

输入 n 个整数,找出其中最小的 k 个数。

注意:

输出数组内元素请按从小到大顺序排序;

数据范围
1≤k≤n≤1000
样例

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

输出:[1,2,3,4]

【题解】-- 堆排序

要维护一个大小为k的大根堆,将数组元素都push进堆,当堆中的数大于k时弹出堆顶元素。
注意 弹出堆顶的顺序是从大到小的k个数,要进行逆序操作。

【解2】--- 快速排序

也可以运用快速排序的思想,每次快速选择会将一个数放置到正确的位置----即满足左边的数都比它小,右边的数都比它大,因此可以对原数组做k次快速选择。

复杂度分析:

建堆的时间复杂度是O(logk),要进行n次建堆的操作。

C++代码实现:

// 堆排序
class Solution {
public:
    vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res;
        priority_queue<int> heap;
        for(auto x : input)
        {
            heap.push(x);
            if(heap.size() > k) heap.pop(); 
        }
        while(heap.size())
        {
            res.push_back(heap.top());
            heap.pop();
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

// 快速排序
class Solution {
public:
    vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res;
        for(int i = 1;i <= k;i++)
            res.push_back(quick_select(input,0,input.size()-1,i));
        return res;
    }

    int quick_select(vector<int>& q,int l,int r,int k)
    {
        if(l >= r) return q[l];
        int i = l-1,j = r+1,x = q[l+r >> 1];
        while(i < j)
        {
            do i++;while(q[i] < x);
            do j--;while(q[j] > x);
            if(i < j) swap(q[i],q[j]);
        }
        if(k <= j-l+1) return quick_select(q,l,j,k);
        else return quick_select(q,j+1,r,k-(j-l+1));
    }

};
目录
相关文章
|
2月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
7月前
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
9月前
|
算法
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
24 0
|
2月前
|
算法
|
2月前
|
算法 C语言
[优选算法]------滑动窗⼝——209. 长度最小的子数组
[优选算法]------滑动窗⼝——209. 长度最小的子数组
|
2月前
|
机器学习/深度学习 算法
【算法 | 实验7】以最小的步骤收集所有硬币(算法正确性还没想清楚)
题目 最小步骤收集硬币 有许多相邻排列的硬币堆。我们需要以最少的步骤收集所有这些硬币,在一个步骤中,我们可以收集一个水平线的硬币或垂直线的硬币,收集的硬币应该是连续的。 输入描述 输入第一行整数N表示硬币堆的数量
45 0
|
2月前
|
算法
算法题解-长度最小的子数组
算法题解-长度最小的子数组
|
2月前
|
存储 算法 vr&ar
☆打卡算法☆LeetCode 209. 长度最小的子数组 算法解析
☆打卡算法☆LeetCode 209. 长度最小的子数组 算法解析
|
2月前
|
存储 算法 搜索推荐
【算法训练-排序算法 二】【快速排序】数组中的第K个最大元素、最小的K个数
【算法训练-排序算法 二】【快速排序】数组中的第K个最大元素、最小的K个数
43 0
|
8月前
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
44 0