春招百题--堆--扩展篇--找出最小

其他类似题目:

373. 查找和最小的 K 对数字
378. 有序矩阵中第 K 小的元素
719. 找出第 K 小的数对距离
786. 第 K 个最小的素数分数
2040. 两个有序数组的第 K 小乘积
2386. 找出数组的第 K 大和

215. 数组中的第K个最大元素

不纠结直接sort排序解决。

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {int n=nums.size();sort(nums.begin(), nums.end());//从小到大排列return nums[n-k];}
};

//sort(nums,nums+n);//sort(s, s + 3);的形式应该只能用在数组,不能用在vector 

719. 找出第 K 小的数对距离

思路:

一开始想的是直接便利,求差值,然后找到第K个。

代码:但超出时间限制  时间复杂度0\left (n ^{2} \right )

class Solution {
public:int smallestDistancePair(vector<int>& nums, int k) {vector<int> distance;int dis;for(int i=0;i<nums.size();i++){for(int j=i+1;j<nums.size();j++){dis=abs(nums[i]-nums[j]);distance.push_back(dis);}}sort(distance.begin(),distance.end());return distance[k-1];}
};

超出时间限制                16 / 19 个通过的测试用例

改进一下: 

方法一:双指针+二分法

这个方法是将距离划分成一个有序序列:距离在(0,max(nums)-min(nums))之间。

这样我们找找出第 K 小的数对距离---》转换为找 距离 序列 里面第k小的元素。--》思考二分法

不同的是,我们这个距离序列需要动态计算,而不是事先求出来的。

为了将计算量减少,我们不防直接计算元素个数与k(个数)相比;而不是原先的  k值与 中间位置的数相比较。

元素个数计算方法:

class Solution {
public:int countPairs(const vector<int>& nums, int mid) {int count = 0;int n = nums.size();int j = 0;for (int i = 0; i < n; ++i) {while (j < n && nums[j] - nums[i] <= mid) {++j;}count += j - i - 1;}return count;}int smallestDistancePair(vector<int>& nums, int k) {sort(nums.begin(), nums.end());int n = nums.size(), left = 0, right = nums.back() - nums.front();while (left <= right) {int mid = left + (right - left) / 2;int cnt = countPairs(nums, mid);if (cnt >= k)right = mid - 1;elseleft = mid + 1;}return left;}
};

378. 有序矩阵中第 K 小的元素

方法一:暴力法

将二维数组存储到一维数组中,然后排序。

class Solution {
public:int kthSmallest(vector<vector<int>>& matrix, int k) {int n=matrix.size();vector<int> ans;for(int i=0;i<n;i++){for(int j=0;j<n;j++)ans.push_back(matrix[i][j]);}sort(ans.begin(),ans.end());return ans[k-1];}
};

时间复杂度:0\left ( n^{2} logn\right )空间复杂度:0\left ( n^{2} \right )

方法二:归并排序--》堆

由题目给出的性质可知,这个矩阵的每一行均为一个有序数组。问题即转化为从这 n 个有序数组中找第 k大的数,可以想到利用归并排序的做法,归并到第 k个数即可停止。

大体思路:

  • 首先,定义了一个结构体 Element,用于表示矩阵中的元素及其在矩阵中的位置。
  • 使用一个最小堆(由 priority_queue 实现),其中元素按照它们的值(val)从小到大排序。这个最小堆用于存储和排序所有可能成为第k小元素的候选。
  • 初始化时,将矩阵的第一列所有元素加入到最小堆中。这是因为矩阵是按行和按列都排序的,所以每行的第一个元素是该行的最小值,有可能是全局第k小的值。
  • 接下来,重复执行k-1次从最小堆中取出元素的操作。每次取出堆顶元素后,检查这个元素是否有右侧的相邻元素(即检查是否到达了其所在行的末尾),如果有,则将这个右侧的相邻元素加入到最小堆中。这保证了堆中始终保存着所有可能是第k小元素的候选。
  • 经过k-1次取出操作后,最小堆的堆顶元素就是第k小的元素,返回其值。
class Solution {
public:int kthSmallest(vector<vector<int>>& matrix, int k) {// 定义一个结构体,用来表示矩阵中的元素及其位置struct Element {int val; // 元素的值int x, y; // 元素在矩阵中的位置(行x,列y)Element(int val, int x, int y) : val(val), x(x), y(y) {}};// 优先队列的比较函数,用于构建最小堆auto cmp = [](const Element& a, const Element& b) {return a.val > b.val;};// 定义一个最小堆,用于存储Element结构体,其中元素按照val值从小到大排序priority_queue<Element, vector<Element>, decltype(cmp)> minHeap(cmp);int n = matrix.size(); // 矩阵的维度// 初始化堆,将矩阵的第一列元素全部加入堆中for (int i = 0; i < n; i++) {minHeap.emplace(matrix[i][0], i, 0);}// 循环k-1次,每次从堆中取出最小的元素,并将该元素所在行的下一个元素加入堆中for (int i = 0; i < k - 1; i++) {Element cur = minHeap.top(); // 取出当前堆顶元素,即最小元素minHeap.pop(); // 从堆中移除该元素if (cur.y != n - 1) { // 如果当前元素不是所在行的最后一个元素// 将当前元素所在行的下一个元素加入堆中minHeap.emplace(matrix[cur.x][cur.y + 1], cur.x, cur.y + 1);}}// 循环结束后,堆顶元素即为第k小的元素return minHeap.top().val;}
};
方法三:二分法

类似上一道题目:

  • 初始化左边界 left 为矩阵中的最小元素,右边界 right 为矩阵中的最大元素。
  • 在 while 循环中,通过二分法不断调整 left 和 right,直到它们相等。
  • 在每次循环中,计算中间值 mid,然后统计矩阵中不大于 mid 的元素个数 count
  • 如果 count 小于 k,说明第 k 小的元素在右半部分,将 left 更新为 mid + 1
  • 否则,第 k 小的元素在左半部分,将 right 更新为 mid
  • 当 left 和 right 收敛时,返回 left 或 right 即可,它们的值相等且为第 k 小的元素。

这种方法的时间复杂度为O(nlog(max-min)),其中n为矩阵的维度,max和min分别为矩阵中的最大值和最小值。

class Solution {
public:int Count(vector<vector<int>>& matrix, int mid) {int count = 0;int n=matrix.size();int j = n - 1;for (int i = 0; i < n; ++i) {while (j >= 0 && matrix[i][j] > mid) {j--;}count += (j + 1);}return count;}int kthSmallest(vector<vector<int>>& matrix, int k) {int n = matrix.size();int left = matrix[0][0]; // 左边界为矩阵中最小的元素int right = matrix[n - 1][n - 1]; // 右边界为矩阵中最大的元素while (left < right) {int mid = left + (right - left) / 2;int count = Count(matrix, mid); // 统计不大于mid的元素个数// 如果count小于k,说明第k小的元素在右半部分if (count < k) {left = mid + 1;} else { // 否则在左半部分right = mid;}}// left和right收敛时,即为第k小的元素return left;}
};

786. 第 K 个最小的质数分数

题目:

给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 质数 组成,且其中所有整数互不相同。

对于每对满足 0 <= i < j < arr.length 的 i 和 j ,可以得到分数 arr[i] / arr[j] 。

那么第 k 个最小的分数是多少呢?  以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i] 且 answer[1] == arr[j] 。

思路:

方法一:二分法

class Solution {
public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n=arr.size();double left=0;double right=1;while(1){double mid=left+(right-left)/2;int i=-1,count=0;int x=arr[0],y=arr[n-1];for(int j=1;j<n;j++){while((double)arr[i+1]/arr[j]<mid){++i;if(arr[i]*y>arr[j]*x){x=arr[i];y=arr[j];}}count+=i+1;}if(count==k) return{x,y};if(count<k) left=mid;else right=mid;}}
};

方法三:优先队列:

使用「扫描点对」+「优先队列(堆)」的做法,使用二元组 (arr[i],arr[j]) 进行存储,构建大小为 k的大根堆。

根据「堆内元素多少」和「当前计算值与堆顶元素的大小关系」决定入堆行为:

  • 若堆内元素不足 k个,直接将当前二元组进行入堆;
  • 若堆内元素已达 k个,根据「当前计算值 arr[i]/arr[j] 与堆顶元素 peek[0]\peek[1]的大小关系」进行分情况讨论:
  •         如果当前计算值比堆顶元素大,那么当前元素不可能是第 k 小的值,直接丢弃;
  •         如果当前计算值比堆顶元素小,那么堆顶元素不可能是第 k小的值,使用当前计算值置换掉堆顶元素。

构建比较关系函数:

// 自定义比较函数,用于维护最小堆auto compare = [](const vector<int>& a, const vector<int>& b) {// 计算分数值,转换为 double 类型进行比较double fracA = static_cast<double>(a[0]) / a[1];double fracB = static_cast<double>(b[0]) / b[1];return fracA < fracB;};

class Solution {
public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n = arr.size();// 自定义比较函数,用于维护最小堆auto compare = [](const vector<int>& a, const vector<int>& b) {// 计算分数值,转换为 double 类型进行比较double fracA = static_cast<double>(a[0]) / a[1];double fracB = static_cast<double>(b[0]) / b[1];return fracA < fracB;};// 声明优先队列,使用自定义比较函数构造最小堆priority_queue<vector<int>, vector<vector<int>>, decltype(compare)> q(compare);// 遍历数组 arr,找到前 k 个最小的质数分数for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {// 计算当前分数值double t = static_cast<double>(arr[i]) / arr[j];// 如果队列大小小于 k 或者当前分数比堆顶元素小,则入堆if (q.size() < k || static_cast<double>(q.top()[0]) / q.top()[1] > t) {if (q.size() == k) q.pop(); // 维护堆大小为 kq.push({arr[i], arr[j]}); // 入堆当前分数对}}}return q.top(); // 返回堆顶元素,即第 k 小的质数分数}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[大模型]Yi-6B-Chat 接入 LangChain 搭建知识库助手

Yi-6B-Chat 接入 LangChain 搭建知识库助手 环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始…

制作framework

参考学习地址 https://www.jianshu.com/p/a15ad98bc965 注意事项&#xff1a; 1、在自动生成的.h文件中引入头文件时&#xff0c;需要完整路径 2、编译成功后如何查看位置 实际位置在&#xff1a; /Users/apple/Library/Developer/Xcode/DerivedData/项目名称-xaskhaskhkas/…

Zookeeper集群部署

目录 1.环境部署 1.1实验环境 1.2安装前环境 2.安装Zookeeper 2.1修改Zookeeper配置配置文件 2.2 设置myid号以及启动脚本 2.3 设置脚本 2.4 加权并加入系统管理 2.5 分别启动三台机器&#xff08;192.168.247.21&#xff09; 2.6 查看三台主机状态信息 1.环境部署 1…

[java]24:集合

集合&#xff1a; 1&#xff09;可以动态保存任意多个对象&#xff0c;使用比较方便&#xff01; 2)提供了一系列方便的操作对象的方法&#xff1a;add、remove、set、get等3&#xff09;使用集合添加&#xff0c;删除新元素的示意代码-简洁了 集合的框架体系&#xff1a; Java…

Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段

4月11日&#xff0c;Kyligence 2024 数智论坛暨春季发布会成功召开。Kyligence 正式发布全新的企业级 AI 解决方案&#xff0c;基于服务金融、零售、制造、医药等行业领先客户的落地实践&#xff0c;Kyligence 为企业提供准确、可靠、智能的 AI 指标平台一站式解决方案&#x…

影响小程序SSL证书收费标准的因素有哪些?

在当今互联网时代&#xff0c;移动应用发展日新月异&#xff0c;小程序逐渐成为广大企业和个人开发者的心仪之选。然而&#xff0c;伴随小程序的广泛应用&#xff0c;安全问题和用户信任显得尤为关键。为了确保小程序的信息传输安全&#xff0c;SSL证书成为了一项基础配置。那么…

Spring Cloud系列(二):Eureka Server应用

系列文章 Spring Cloud系列(一)&#xff1a;Spirng Cloud变化 Spring Cloud系列(二)&#xff1a;Eureka Server应用 目录 前言 注册中心对比 Nacos Zookeeper Consul 搭建服务 准备 搭建 搭建父模块 搭建Server模块 启动服务 测试 其他 前言 前面针对新版本的变化有了…

SD-WAN企业网络部署模式及适用企业类型

随着企业规模的扩张和数字化转型的推进&#xff0c;SD-WAN作为一种灵活、安全和高效的组网解决方案备受关注。那么&#xff0c;SD-WAN在企业网络部署中有哪些常见模式&#xff1f;又有哪些类型的企业最适合采用SD-WAN呢&#xff1f;让我们一起来了解一下&#xff01; 常见的SD-…

算法修炼之路之双指针含多道leetcode 经典题目

目录 前言 一&#xff1a;普通双指针 1.经典题目一 283移动0问题 分析 代码实现 2.经典题目二 1089复写0 分析 代码实现 二&#xff1a;解决成环类问题-快慢指针 经典例题一 202快乐数 分析 代码实现 三&#xff1a;左右相遇指针 经典例题一 11 盛最多水的容…

基于Whisper语音识别的实时视频字幕生成 (一): 流式显示视频帧和音频帧

Whishow Whistream&#xff08;微流&#xff09;是基于Whisper语音识别的的在线字幕生成工具&#xff0c;支持rtsp/rtmp/mp4等视频流在线语音识别 1. whishow介绍 whishow&#xff08;微秀&#xff09;是python实现的在线音视频流播放器&#xff0c;支持rtsp/rtmp/mp4等流式输…

说说TCP为什么需要三次握手和四次挥手?

文章目录 一、三次握手为什么不是两次握手? 二、四次挥手四次挥手原因 三、总结参考文献 一、三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和…

毅速ESU丨增材制造有助于传统制造企业打造新增长极

在科技浪潮的推动下&#xff0c;传统制造企业正面临着前所未有的挑战与机遇。产品的复杂程度不断提升&#xff0c;个性化需求层出不穷&#xff0c;越来越短的生产周期&#xff0c;不断升级的品质要求等&#xff0c;传统的生产模式在应对这些变化并不容易。而增材制造&#xff0…

AI赋能校园管理,打造平安智慧校园解决方案

背景&#xff1a; 2020年教育部办公厅印发《教育系统安全专项整治三年行动实施方案》&#xff0c;文中要求&#xff0c;学校在所辖范围内组织开展安全专项整治三年行动&#xff0c;健全完善安全责任体系&#xff0c;建立风险管控和隐患治理的安全防控体系&#xff0c;开展消防等…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起&#xff0c;与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族&#xff0c;Ransomhub和Blackbasta恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。…

基于 YOLOv9 的自定义数据集目标检测

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在本指南中&#xff0c;我们将展示使用自定义数据集训练 YOLOv9 模型的过程。具体而言&#xff0c;我们将提供一个示例&#xff0c;重点介绍训练一个视觉模型来识别篮球场上的篮球运动员。但是&#xff0c;这个指南是多功…

Web中使用Weblogic用户

WebLogic用户&#xff0c;组设置 1. 登录weblogic console, domain结构中选择Security Realms&#xff0c;显示安装时默认创建的Realm &#xff1a; myrealm 2. 点击myrealm, 选择 users and Group&#xff0c; 追加用户和组 选择既存的权限组追加到新规的组中&#xff0c;赋予…

java智慧校园系统源码saas电子班牌固件安卓7.1+Java Android原生系统源码

java智慧校园系统源码saas电子班牌固件安卓7.1&#xff0b;Java Android原生系统源码 智慧校园是促进信息技术与教育教学深度有效融合、提高学与教的效果为目的&#xff0c;以物联网、云计算、大数据分析等新技术为核心技术&#xff0c;提供一种环境全面感知、智慧型、数据化、…

Linux 删除文件或文件夹命令(新手)

一、删除文件夹 rm -rf 路径/目录名 1 强制删除文件夹及其子文件。 二、删除文件/文件夹&#xff1a;rm 命令 rm 删除命令&#xff0c;它可以永久删除文件系统中指定的文件或目录。 rm [选项] 文件或目录 选项&#xff1a; -f&#xff1a;强制删除&#xff08;force&am…

前端大屏项目适配方法

要在F11全屏模式下查看 方法一&#xff0c;rem font-size 动态设置HTML根字体大小 和 body 字体大小&#xff08;lib_flexible.js&#xff09; 将设计稿的宽&#xff08;1920&#xff09;平均分成 24 等份&#xff0c; 每一份为 80px。HTML字体大小就设置为 80 px&#xff…

SonarQube 9.9.4 LTS社区版安装

目标 安装个SonarQube社区版. 安装SonarQube9.9.4 LTS社区版 https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.4.87374.zip # 切换到安装目录 cd /opt # 下载安装包 sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube…