786. K-th Smallest Prime Fraction
786. K-th Smallest Prime Fraction
https://www.cnblogs.com/grandyang/p/9135156.html
数组本身是排序的,所以固定一个数,从左向右得到的分数是逐渐减小的。
使用二分查找,设定一个值,然后统计所有小于这个数的个数,如果个数小于期望的k,那么把这个数调大再统计,如果大于期望k,把这个数调小再统计,直到个数等于k。
注意:1.left、right定义时必须是double的,因为分数不是整数
2.每次统计,统计的j的位置是第一个小于mid的位置,也就是说之前的数都是大于mid的,因为求的是第k小,所以必须是n-j来获得到底有多少个小的数
3.因为需要返回第k小的分数的分子、分母,所以必须进行保存。i固定j滑动每次停止的位置,肯定有一个是这个第k小的,但是你并不能保证i=0 j停止的数一定大于i = 1 j停止的数,所以取其中最大的就是真正的那个需要的数
4.mid*A[j] < A[i] A[i]*q > p*A[j]都是为了保证除数进行无限循环
5.count < K的时候是left = mid,而不是right = mid,因为这个时候count不够,你需要调大mid值,调大也就是增大left
6.count的统计是i固定每个位置,然后j向后滑动得到的总的count值
class Solution { public: vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) { double left = 0,right = 1; vector<int> res; int n = A.size(); while(true){ double mid = left + (right - left)/2.0; int count = 0,p = 0,q = 1; for(int i = 0;i < n;i++){ int j = i + 1; while(j < n && mid*A[j] < A[i]) j++; count += n - j; if(j < n && A[i]*q > p*A[j]){ p = A[i]; q = A[j]; } } if(count == K){ res.push_back(p); res.push_back(q); return res; } else if(count < K) left = mid; else right = mid; } } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2018-08-06 pooling、relu、convolution的反向传播