分治算法(4)_快速选择_库存管理III_面试题

news/2024/12/22 9:59:41/

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

分治算法(4)_快速选择_库存管理III_面试

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

温馨提示:

1. 题目链接:

2. 题目描述:

3. 解法(快速选择)

算法思路:  

代码展示:

结果分析: 


温馨提示:

该问题是top k问题的一类,top k问题可以使用堆排序和快速排序解决,因为题目要求使用O(N)的时间复杂度解决该问题,所以我这里就直接使用快速排序解决,想看堆排序的宝子们可以取下面的博客查看:

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)-CSDN博客 

1. 题目链接:

OJ链接 : 库存管理

2. 题目描述:

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2:

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2] 或 [2,0]

提示:

  • 0 <= cnt <= stock.length <= 10000
    0 <= stock[i] <= 10000

 

3. 解法(快速选择)

算法思路:  

这道题跟上道"找到第k个最大数"的题很想,建议大家先去看那道题,算法思路基本上是一致的.

分治算法(3)_快速选择_数组中的第K个最大元素-CSDN博客 

在快排中,当我们把数组[分成三块]之后: [l, left] [left + 1, right - 1] [right, r],我们可以通过计算每一个区间内元素的[个数],进而推断出最小的k个数在那些区间里面.

那我们可以直接去[相应的区间]继续划分数组即可.

  

代码展示:

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(NULL));qsort(stock, 0, stock.size() - 1, cnt);return {stock.begin(), stock.begin() + cnt};}void qsort(vector<int>& nums, int l, int r, int cnt){if(l >= r) return;int key = getRandom(nums, l, r);int i = l, left = l - 1, right = r + 1;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]);}int a = left - l + 1;int b = right - left - 1;if(a > cnt) qsort(nums, l, left, cnt);else if(a + b >= cnt) return;else qsort(nums, right, r, cnt - a - b);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[left + r % (right - left + 1)];}
};

 

结果分析: 

示例分析 :

 

在随机选择基准的情况下,期望的时间复杂度为 O(n)。这是因为在平均情况下,基准会将数组大致分成两半,这样每次递归将处理的元素数量减少大约一半。
由于每次递归的分区工作是线性的(O(n)),整个过程在期望情况下是 O(n) 的。 


http://www.ppmy.cn/news/1536123.html

相关文章

通过下面步骤高效提升前端加载静态文件效率

每次刷新页面都会重新从服务器拉取静态文件,这样会导致页面加载变慢,特别是在静态文件较大的情况下(如 CSS、JS、图片等)。为了提升页面的加载效率,最常见的优化方式是利用 浏览器缓存机制 和 文件压缩。以下是一些提升效率的方法: 1. 使用浏览器缓存 (HTTP 缓存头) 缓…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站&#xff1a;Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符&#xff0c;拉取 GitLab 镜像&#xff1a; docker pull gitlab/gitlab-ee:latest或则使用社区版&#xff1a; docker pull gitlab/gitlab-ce…

比亚迪「召回」热销车!谁担责

作为整车关键的安全件&#xff0c;底盘系统是支持行车安全与舒适的基石。相比于主、被动安全系统&#xff0c;底盘系统的故障&#xff0c;更容易直接导致事故风险的急剧上升。 9月29日&#xff0c;比亚迪发布召回公告&#xff0c;召回2023年2月4日至2023年12月26日期间生产的部…

数据库分区

一.分区简述 1&#xff09;分区的背景&#xff1a;当表中的数据量不断增大&#xff0c;查询数据的速度就会变慢(且加了索引 之后&#xff0c;仍然没有改观时)&#xff0c;这时就可以考虑对表进行分区。 2&#xff09;分区的粒度&#xff1a;某张表的大小超过2GB&#xf…

OSINT技术情报精选·2024年9月第4周

OSINT技术情报精选2024年9月第4周 2024.10.1版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、大模型行业可信应用框架研究报告 在2024年9月5日举行的Inclusion外滩大会“大模型的创造力边界与应用想象力”分论坛上&#xff0c;蚂蚁集团…

网络知识点之—EVPN

EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面&#xff0c;利用BGP扩展协议来传递二层或三层的可达性信息&#xff0c;实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

sidecar 和 插件的区别

Sidecar 和插件是两个不同的概念&#xff0c;尽管它们都可以提高应用程序的可维护性和可扩展性&#xff0c;但它们的实现方式和用途是不同的。 Sidecar 是一种设计模式&#xff0c;主要用于在容器化环境中将辅助功能与主应用程序分离。在这种模式下&#xff0c;主应用程序运行…

PostgreSQL 和Oracle表压缩的适用场景和限制条件

PostgreSQL 和Oracle表压缩的适用场景和限制条件 Oracle 表压缩的适用场景和限制条件 Oracle 提供了多种表压缩技术&#xff0c;每种技术都有其特定的适用场景和限制条件。 适用场景 数据仓库和历史数据存储&#xff1a; 基本表压缩&#xff1a;适用于较少更新的表&#xff…