当前位置: 首页 > article >正文

力扣—面试题 17.14. 最小K个数

面试题 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))

方法一:优先级队列

先取前四个,默认最大堆排序,从第k个开始比较 小就放入队列,大就不要,再传入数组里,输出数组

class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) {
        if(arr.size() == 0 || k <= 0) return {};
        priority_queue<int>que;
        vector<int> res;
        for(int i = 0;i < k;i++){
            que.push(arr[i]);
        } 
        for(int i = k;i < arr.size();i++){
            if(arr[i] < que.top()){
                que.pop();
                que.push(arr[i]);
            }
        }
        while(!que.empty()){
            res.push_back(que.top());
            que.pop();
        }
        return res;
    }
};

方法二:堆排序

class Solution {
public:
    void adjust(vector<int>& arr,int start,int end)
    {
           int father = start;
           int child = father * 2 + 1;
           while(child <= end)
           {
                if(child + 1 <= end && arr[child] < arr[child + 1]) child++;
                if(arr[child] > arr[father]) 
                {
                    swap(arr[child] , arr[father]);
                    father = child;
                    child = father * 2 + 1;
                }
                else 
                {
                    break;
                }
           } 
    }
    vector<int> smallestK(vector<int>& arr, int k) {
        if(arr.size() == 0 || k <= 0) return  {};
        for(int i = k / 2 - 1;i >= 0;i--)
        {
            adjust(arr,i,k - 1);
        }
        for(int i = k;i < arr.size();i++)
        {
            if(arr[0] > arr[i])
            {
               swap(arr[0] , arr[i]);
               adjust(arr,0,k-1);
            }
        }
        vector<int> res;
        for(int i = 0 ;i < k;i++)
        {
            res.push_back(arr[i]);
        }
        return res;
    }
};

方法三:快速排序

class Solution {
public:
    int Quick(vector<int> &arr, int L, int R){
        int i = L - 1;
        int j = R + 1;
        int index = L;
        int temp = arr[L];
        while(index < j){
            if(arr[index] > temp) swap(arr[--j], arr[index]);
            else if (arr[index] < temp) swap(arr[++i], arr[index++]);
            else index++;
        }
        return i + 1;
    }
    void Quicksort(vector<int>&arr, int L , int R , int k){
        if(L > R) return;
        int p = Quick(arr, L, R);
        if(p > k) Quicksort(arr,L, p - 1, k);
        else if(p< k) Quicksort(arr, p + 1, R, k);
        else return;
    }
    vector<int> smallestK(vector<int>& arr, int k) {
        if(arr.size() == 0 || k == 0) return{};
        Quicksort(arr, 0, arr.size() - 1, k);
        vector<int> res;
        for(int i = 0; i < k; i++){
            res.push_back(arr[i]);
        }
        return res;
    }
};


http://www.kler.cn/a/407138.html

相关文章:

  • 浪潮信息自动驾驶框架AutoDRRT 2.0,赋能高阶自动驾驶
  • 基于YOLOv8深度学习的智慧农业果园果树苹果类果实目标检测系统(PyQt5界面+数据集+训练代码)
  • tomcat 后台部署 war 包 getshell
  • 测试工程师如何在面试中脱颖而出
  • 7天掌握SQL - 第三天:MySQL实践与索引优化
  • 大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志
  • 多目标优化算法:多目标河马优化算法(MOHOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码
  • C++中类的继承
  • 25.UE5时间膨胀,慢动作,切换地图,刷BOSS
  • 使用flink编写WordCount
  • 高频面试题(含笔试高频算法整理)基本总结回顾23
  • 界面控件DevExpress WinForms v24.2新功能预览 - 人工智能(AI)
  • vue2 _src_Todolist自定义事件版本
  • JavaWeb——Maven、web入门
  • 前端测试工具(Jest与Mock)
  • 体验免费开箱即用的AI工具:Blackbox.AI
  • 【100ask】IMX6ULL开发板用SPI驱动RC522模块
  • 【手写一个spring】spring源码的简单实现--BeanPostProcessor(实现AOP)以及JDK动态代理/CGLIB动态代理
  • 太速科技-297-基于XC7A100T的PCIe千兆电口以太网收发卡
  • css效果
  • 如何进行模板特化和偏特化?
  • 学习日记_20241123_聚类方法(高斯混合模型)续
  • 蚁群算法(Ant Colony Optimization, ACO)
  • 速盾:CDN缓存的工作原理是什么?
  • Linux---ps命令
  • 论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)