LeetCode 786. 第 K 个最小的素数分数

🔗 原题链接:786. 第 K 个最小的素数分数

本题可以暴力求解:

class Solution {
public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n = arr.size();vector<pair<int, int>> frac;for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {frac.emplace_back(arr[i], arr[j]);}}sort(frac.begin(), frac.end(), [](const auto& x, const auto& y) {return x.first * y.second < x.second * y.first;});return {frac[k - 1].first, frac[k - 1].second};}
};

因为用到了排序,所以时间复杂度是 O ( n 2 log ⁡ n 2 ) = O ( n 2 log ⁡ n ) O(n^2\log n^2)=O(n^2\log n) O(n2logn2)=O(n2logn)

这里有一个小细节,我们在判断 a b < c d \frac{a}{b}<\frac{c}{d} ba<dc 的时候可以将其转化成 a ∗ d < b ∗ c a*d<b*c ad<bc,这样不会引入浮点数的误差。


本题还有更优雅的解法,复杂度为 O ( k log ⁡ n ) O(k\log n) O(klogn)

当分母选定为 a r r [ j ] arr[j] arr[j] 时,分子只能从 a r r [ 0 ] , a r r [ 1 ] , ⋯ , a r r [ j − 1 ] arr[0],arr[1],\cdots,arr[j-1] arr[0],arr[1],,arr[j1] 中选,因此我们可以将 a r r [ j ] arr[j] arr[j] 看成一个长度为 j − 1 j-1 j1 的列表:

a r r [ 0 ] a r r [ j ] , a r r [ 1 ] a r r [ j ] , ⋯ , a r r [ j − 1 ] a r r [ j ] \frac{arr[0]}{arr[j]},\frac{arr[1]}{arr[j]},\cdots,\frac{arr[j-1]}{arr[j]} arr[j]arr[0],arr[j]arr[1],,arr[j]arr[j1]

且这个列表是单调递增的。

于是整个 a r r arr arr 数组可以看成 n − 1 n-1 n1单调递增的列表:

0 : ∅ 1 : a r r [ 0 ] a r r [ 1 ] 2 : a r r [ 0 ] a r r [ 2 ] , a r r [ 1 ] a r r [ 2 ] ⋮ n − 1 : a r r [ 0 ] a r r [ n − 1 ] , a r r [ 1 ] a r r [ n − 1 ] , ⋯ , a r r [ n − 2 ] a r r [ n − 1 ] \begin{aligned} 0:\quad&\varnothing \\ 1:\quad&\frac{arr[0]}{arr[1]} \\ 2:\quad&\frac{arr[0]}{arr[2]},\frac{arr[1]}{arr[2]} \\ \vdots \\ n-1:\quad&\frac{arr[0]}{arr[n-1]},\frac{arr[1]}{arr[n-1]},\cdots,\frac{arr[n-2]}{arr[n-1]} \\ \end{aligned} 0:1:2:n1:arr[1]arr[0]arr[2]arr[0],arr[2]arr[1]arr[n1]arr[0],arr[n1]arr[1],,arr[n1]arr[n2]

于是我们可以像「合并K个有序链表」那样找到第 k k k 小的素数分数。

注意,如果我们一开始就把 n − 1 n-1 n1 个“链表”全部构造出来,花费的时间就已经是 O ( n 2 ) O(n^2) O(n2) 了。这里有一个巧妙的做法,我们一开始只把 n − 1 n-1 n1 个“链表”的表头加入到优先队列中,后续看哪一个链表的表头被弹出,就向优先队列中加入该链表的下一个“节点”。

弹出 k − 1 k-1 k1 次后,优先队列的队头就是最终的答案。

class Solution {
public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n = arr.size();auto cmp = [&](const auto& x, const auto& y) {return arr[x.first] * arr[y.second] > arr[x.second] * arr[y.first];};priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq(cmp);for (int i = 1; i < n; i++) pq.emplace(0, i);for (int t = 0; t < k - 1; t++) {auto [i, j] = pq.top();pq.pop();if (i + 1 < j) pq.emplace(i + 1, j);}return {arr[pq.top().first], arr[pq.top().second]};}
};

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

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

相关文章

Vue使用jspdf和html2canvas组件库结合导出PDF文件

效果图&#xff1a; 1、安装依赖&#xff1a; npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封装全局调用方法&#xff1a;this.$exportPDF(#id,文件名) 新建js文件&#xff1a;/utils/html2Pdf.js&am…

在linux中,使用sh文件脚本启动jar项目

使用方法 sh 执行脚本.sh [start|stop|restart|status]sh文件内容 APP_NAMEXXXX.jar#使用说明&#xff0c;用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]" exit 1 }#检查程序是否在运行 is_exist(){ pidps -ef|grep $APP_N…

数据结构:选择排序

简单选择排序 选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大&#xff08;最小&#xff09;的元素&#xff0c;存放到排序学列的其实位置&#xff0c;然后在剩余的未排序的元素中寻找最小&#xff08;最大&#xff09;元素&#xff0c;存放在已排序序列的后面…

高等数学:牛顿迭代发解方程

现在高数也要介绍牛顿法了&#xff0c;一般都是从几何上直接以“切线法”直接引入的。这种引入方式的确很简单&#xff0c;但如果脱离深入一点的分析就不大容易解释后面的事情。所以就在想怎么更直接地从分析的角度来一条线贯穿&#xff0c;把整个过程说一说。 文章目录 一、牛…

【深度学习】PyTorch快速入门

【深度学习】学习PyTorch基础 介绍PyTorch 深度学习框架是一种软件工具&#xff0c;旨在简化和加速构建、训练和部署深度学习模型的过程。深度学习框架提供了一系列的函数、类和工具&#xff0c;用于定义、优化和执行各种深度神经网络模型。这些框架帮助研究人员和开发人员专注…

漏洞+常见漏洞修复建议

一、漏洞级别 高级别漏洞&#xff1a;大部分远程和本地管理员权限漏洞 中级别漏洞&#xff1a;大部分普通用户权限、权限提升、读懂受限文件、远程和本杜漏洞、拒绝服务漏洞 低级别漏洞&#xff1a;大部分远程非授权文件存取、口令恢复、欺骗、信息泄露漏洞 二、漏洞扫描的…

Kotlin Lambda和高阶函数

Lambda和高阶函数 本文链接&#xff1a; 文章目录 Lambda和高阶函数 lambda输出&#xff08;返回类型&#xff09;深入探究泛型 inline原理探究 高阶函数集合、泛型自己实现Kotlin内置函数 扩展函数原理companion object 原理 > 静态内部类函数式编程 lambda 1、lambda的由…

Flink流批一体计算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment 创建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…

嵌入式Linux开发实操(九):CAN接口开发

前言: CAN网络在汽车中的使用可以说相当广泛。而CAN网络需要的收发器最常用的就是NXP 的TJA1042: CAN网络:

605. 种花问题

链接 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&#xff0c;其中…

8/16总结

WebSocket是双向通信协议&#xff0c;模拟Socket协议&#xff0c;可以双向发送或者接收信息 而Http是单向的 WebSocket是需要浏览器和服务器握手进行建立连接的 而http是浏览器发起向服务器的连接&#xff0c;服务器预先并不知道这个连接 WebSocket在建立握手时&#xff0c;数…

Python3内置函数大全

吐血整理 Python3内置函数大全 1.abs()函数2.all()函数3.any()函数4.ascii()函数5.bin()函数6.bool()函数7.bytes()函数8.challable()函数9.chr()函数10.classmethod()函数11.complex()函数12.complie()函数13.delattr()函数14.dict()函数15.dir()函数16.divmod()函数17.enumer…

注解@JsonInclude

注解JsonInclude 1. 注解由来 JsonInclude是一个用于Java类中字段或方法的注解&#xff0c;它来自于Jackson库。Jackson库是一个用于处理JSON数据的流行开源库&#xff0c;在Java对象和JSON之间进行序列化和反序列化时经常被使用。 2. 注解示例 下面是JsonInclude注解的一个…

【kubernetes】Pod控制器

目录 Pod控制器及其功用 pod控制器有多种类型 1、ReplicaSet ReplicaSet主要三个组件组成 2、Deployment 3、DaemonSet 4、StatefulSet 5、Job 6、Cronjob Pod与控制器之间的关系 1、Deployment 查看控制器配置 查看历史版本 2、SatefulSet 为什么要有headless&…

2023-08-18力扣每日一题

链接&#xff1a; 1388. 3n 块披萨 题意&#xff1a; 一个长度3n的环&#xff0c;选n次数字&#xff0c;每次选完以后相邻的数字会消失&#xff0c;求选取结果最大值 解&#xff1a; 这波是~~&#xff08;ctrl&#xff09;CV工程师了~~ 核心思想是选取n个不相邻的元素一定…

无涯教程-Perl - splice函数

描述 此函数从LENGTH元素的OFFSET元素中删除ARRAY元素,如果指定,则用LIST替换删除的元素。如果省略LENGTH,则从OFFSET开始删除所有内容。 语法 以下是此函数的简单语法- splice ARRAY, OFFSET, LENGTH, LISTsplice ARRAY, OFFSET, LENGTHsplice ARRAY, OFFSET返回值 该函数…

Vue 项目运行 npm install 时,卡在 sill idealTree buildDeps 没有反应

解决方法&#xff1a;切换到淘宝镜像。 以下是之前安装的 xmzs 包&#xff0c;用于控制切换淘宝镜像。 该截图是之前其他项目切换淘宝镜像的截图。 切换镜像后&#xff0c;顺利执行 npm install 。

生成国密密钥对

在线生成国密密钥对 生成的密钥对要妥善保管&#xff0c;丢失是无法找回的。

selinux

一、selinux的说明 二、selinux的工作原理 三、selinux的启动、关闭与查看 Enforcing和permissive都是临时的&#xff0c;重启还是依据配置文件中&#xff0c;禁用selinux&#xff0c;修改配置文件&#xff1a; 之后重启生效 四、selinux对linux服务的影响

SpringBoot 接口调用出现乱码解决 中文乱码

SpringBoot 接口调用出现乱码解决 package com.cxjg.mvc.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springfra…