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

【快速选择算法】解决TopK问题中前K小的数字问题

在这里插入图片描述

目录

  • 1.前言
  • 2.题目简介
  • 3.求解思路
  • 4.示例代码

1.前言

在一个数组中找到这个数组前K小的数字有三种方式:

  • 排序 O(N*logN)
  • 堆排序:建立一个k个大小的大堆(如果是找前K大的数字的话用小堆) O(N*logK)
  • 快速选择算法:原地交换数字,使得该数组前k个数字就是该数组前K小的数字 一般情况接近O(N),最差情况O(N^2)

2.题目简介

题目链接:LINK
在这里插入图片描述

3.求解思路

在这里插入图片描述
在这里插入图片描述

4.示例代码

class Solution {
public:
    vector<int> inventoryManagement(vector<int>& nums, int k) 
    {
        srand(time(nullptr));

        qsort(nums, 0, nums.size() - 1, k);
        return {nums.begin(), nums.begin() + k};
    }

    void qsort(vector<int>& nums, int begin, int end, int k)
    {
        if(begin >= end) return;

        //数组分三块
        int key = GetRandom(nums, begin, end);
        int left = begin - 1, right = end + 1, i = begin;
        while(i < right)
        {
            if(nums[i] < key)
            {
                swap(nums[i++], nums[++left]);
            }
            else if(nums[i] == key)
            {
                i++;
            }
            else //nums[i] > key
            {
                swap(nums[i], nums[--right]);
            }
        }

        //分情况讨论
        int a = left - begin + 1;
        int b = right - 1 - (left + 1) + 1;
        int c = end - begin + 1 - a - b;
        if(a >= k) qsort(nums, begin, left, k);
        else if(a + b >= k) return;
        else qsort(nums, right, end, k - a - b);
    }
    int GetRandom(vector<int>& nums, int begin, int end)
    {
        return nums[rand() % (end - begin + 1) + begin];
    }
};

在这里插入图片描述


EOF


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

相关文章:

  • 【已上线】C++ mysql连接池
  • 个人博客系统项目大全【6万字】
  • 网络缓存:加速网络应用的隐形引擎
  • 【numpy1】ipython模块、jupyter模块、Anaconda主要功能、notebook详细功能、数据分析三剑客、numpy实现BMI指数
  • cuda,torch,paddle向下兼容
  • fabricjs 添加图片并实时更新小车位置
  • 游戏开发设计模式之单例模式
  • 《javaEE篇》--线程池
  • [Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解
  • CCF CSP题解:因子化简(202312-2)
  • 宠物毛发会携带病菌源吗?宠物店空气净化器使体验分享
  • 【在Linux世界中追寻伟大的One Piece】传输层协议UDP
  • 微软将持续多年的 Mono 项目移交给 Wine
  • 力扣2132.用邮票贴满网格图
  • 【奇某信-注册/登录安全分析报告】
  • 云计算实训38——docker网络、跨主机容器之间的通讯
  • 招募进行中 | 在热爱中持续分享,快来报名加入!
  • 【书生大模型实战营(暑假场)】进阶任务六 MindSearch CPU-only 版部署
  • 惊恐!数据硬删除了?那怎么恢复?
  • MySQL数据库MVCC机制底层原理详解