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

二分猜答案

二分

前后缀分解

lc786

二分查找分数值范围,统计小于等于中间值的分数个数,定位第k小的素数分数并返回

#include <vector>
using namespace std;

class Solution {
private:
vector<int> arr;
int n, a, b;
public:
vector<int> kthSmallestPrimeFraction(vector<int>& _arr, int k) {
arr = _arr;
n = arr.size();
double l = 0, r = 1;
while (true) {
double mid = (l + r) / 2;
int cnt = check(mid);
if (cnt > k) r = mid;
else if (cnt < k) l = mid;
else break;
}
return {a, b};
}
private:
int check(double x) {
int ans = 0;
double large = 0;
for (int i = 0, j = 1; j < n; j++) {
while (arr[i + 1] * 1.0 / arr[j] <= x)
i++;

if (arr[i] * 1.0 / arr[j] <= x) {
ans += i + 1;
if (arr[i] * 1.0 / arr[j] > large) {
a = arr[i];
b = arr[j];
large = arr[i] * 1.0 / arr[j];
}
}
}
return ans;
}
};
核心逻辑:用二分查找定位“第k小的素数分数”,不用暴力枚举所有分数,效率更高

1. 前提:输入数组是从小到大排序的素数,要找的是“两个素数相除(分子在前、分母在后,分子<分母)”中第k小的那个分数(比如数组[2,3,5],分数有2/3、2/5、3/5,第2小是2/5)

2. 二分查找的是什么?

不直接找分数,而是找“分数的数值大小”。因为所有可能的分数都在 0~1 之间(分子<分母),所以在 [0,1] 区间里二分:

- 每次取中间值 mid ,统计“所有小于等于 mid 的分数有多少个”(用 check 函数算)

- 如果统计数 >k:说明第k小的分数比 mid 小,缩小右边界;

- 如果统计数 <k:说明第k小的分数比 mid 大,扩大左边界;

- 统计数 ==k:说明 mid 刚好“卡”在第k小的分数上,找到目标。

3. check函数怎么统计?

用“双指针”高效计数(不用两两枚举,避免超时):

- 固定分母 j ,找最大的分子 i 使得 arr[i]/arr[j] ≤ mid (因为数组有序, i 越大,分数越大);

- 此时, i+1 就是以 arr[j] 为分母、满足条件的分数个数(分子可以是 arr[0]~arr[i] );

- 同时记录这些分数中最大的那个(因为统计数==k时,这个最大分数就是第k小的目标)。

http://www.jsqmd.com/news/211932/

相关文章:

  • 二分猜答案
  • 嵌入式工程师面试宝典:常见算法题与底层驱动问题解析
  • rust学习-探讨为什么需要标注生命周期
  • Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql
  • DeepSeek R1 简易指南:架构、本地部署和硬件要求
  • 基于Python的智能房价分析与预测系统设计-计算机毕业设计源码+LW文档
  • CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
  • 基于Python爬虫的网络小说热度分析django-计算机毕业设计源码+LW文档
  • 2026年最新爆火!7款AI论文写作神器限时实测,一键生成文献综述与真实交叉引用
  • com.microsoft.sqlserversqljdbc4jar4.0 was not found产生原因及解决步骤
  • docker安装redis
  • com.mysql.cj.jdbc.exceptions.CommunicationsException Communications link failure 问题解决
  • 【NLP】Hugging Face使用指南
  • atl110.dll文件丢失找不到 打不开问题 免费下载方法分享
  • Git合并时忽略文件的6种技巧
  • 在 Ubuntu 下载 Typora
  • RK3588+kylin V10安装docker
  • python---正则表达式
  • ATL80.dll文件丢失找不到 打不开问题 免费下载方法分享
  • 最新爆火6款免费AI论文神器!PaperTan一站式搞定选题降重
  • Linux 命令行实战训练营(
  • 超强在线图片处理器:支持各种格式转换GIF/AVIF/HEIF
  • VisionPro二开之九点标定
  • Design Fluid Viscous Dampers in SAP2000 and Peform3D
  • 2026新测!这几款款亲测有效的降ai率工具推荐,含手把手教你论文降ai,查重率从红变绿只需几分钟!
  • VisionPro之九点标定
  • 全网最全ai降ai方法:亲测能有效降低ai痕迹,论文降aigc从此不求人,导师看了都说好!
  • 程序媛失业第七天
  • 基于Python+Django的社区服务管理系统设计与实现
  • CES 2026最酷笔记本电脑:可拆卸设计成为新趋势