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

公司网站建设工作通知/特大新闻凌晨刚刚发生

公司网站建设工作通知,特大新闻凌晨刚刚发生,深圳建西站,怎么做快三彩票网站题目描述 给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 素数 组成&#xff0c;且其中所有整数互不相同。 对于每对满足 0<i<j<arr.length0 < i < j < arr.length0<i<j<arr.length 的 iii 和 jjj &#xff0c;可以得到分…

题目描述

给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 素数 组成,且其中所有整数互不相同。
对于每对满足 0<i<j<arr.length0 < i < j < arr.length0<i<j<arr.lengthiiijjj ,可以得到分数 arr[i]/arr[j]arr[i] / arr[j]arr[i]/arr[j]
那么第 kkk 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0]==arr[i]answer[0] == arr[i]answer[0]==arr[i]answer[1]==arr[j]answer[1] == arr[j]answer[1]==arr[j]

示例1:

输入:arr = [1,2,3,5],  k = 3
输出:[2,5]
解释:已构造好的分数,排序后如下所示: 
1/5, 1/3, 2/5, 1/2, 3/5, 2/3
很明显第三个最小的分数是 2/5。

示例2:

输入:arr = [1,7], k = 1
输出:[1,7]

题解思路

记数组arrarrarr的长度为nnn。最简单粗暴的想法就是将所有的可能枚举出来,共n(n−1)2\frac{n(n - 1)}{2}2n(n1)种可能,并将其排序,然后寻找第kkk个小的。这种解法虽然能过,但效率还是特别低的,时间复杂度为O(n2logn)O(n^{2}logn)O(n2logn),空间复杂度为O(n2)O(n^{2})O(n2)。这问题大嘛?问题不大,能写出来就行,但咱就是说有没有看上去高级一点的方法,还是有的。

优先队列(堆)

其实得益于数组arrarrarr是递增的,所以在所有形成的分数中,是有顺序的。我们将分母记为arr[j]arr[j]arr[j],对于每一个分母,记其分子为arr[i]arr[i]arr[i]。我们将每一个分母看成一个长度为jjj的列表,即:
arr⁡[0]arr⁡[j],arr⁡[1]arr⁡[j],⋯,arr⁡[j−1]arr⁡[j]\frac{\operatorname{arr}[0]}{\operatorname{arr}[j]}, \frac{\operatorname{arr}[1]}{\operatorname{arr}[j]}, \cdots, \frac{\operatorname{arr}[j-1]}{\operatorname{arr}[j]} arr[j]arr[0],arr[j]arr[1],,arr[j]arr[j1]
显而易见,这些列表是递增的。此时,我们要找到这n−1n-1n1个列表中第kkk个最小的分数,可以采用优先队列来解决。初始时,优先队列里包含着n−1n-1n1个分数(arr⁡[0]arr⁡[1],⋯,arr⁡[0]arr⁡[n−1]\frac{\operatorname{arr}[0]}{\operatorname{arr}[1]}, \cdots, \frac{\operatorname{arr}[0]}{\operatorname{arr}[n-1]}arr[1]arr[0],,arr[n1]arr[0]),每次从队列中选取最小的分数,arr⁡[i]arr⁡[j]\frac{\operatorname{arr}[i]}{\operatorname{arr}[j]}arr[j]arr[i],如果i+1=ji+1=ji+1=j,说明这个分数是arr⁡[j]\operatorname{arr}[j]arr[j]队列中最大的一个;如果i+1<ji+1<ji+1<j,说明我们选取了arr⁡[i]arr⁡[j]\frac{\operatorname{arr}[i]}{\operatorname{arr}[j]}arr[j]arr[i]只好要将arr⁡[i+1]arr⁡[j]\frac{\operatorname{arr}[i+1]}{\operatorname{arr}[j]}arr[j]arr[i+1]再放入队列中。此时的时间复杂度为O(klogn)O(klogn)O(klogn),单次优先队列操作的复杂度为O(logn)O(logn)O(logn),一共要执行kkk次,空间复杂度为O(n)O(n)O(n)
代码如下:

class Frac:def __init__(self, idx: int, idy: int, x: int, y: int) -> None:self.idx = idxself.idy = idyself.x = xself.y = ydef __lt__(self, other: "Frac") -> bool:# python中的富比较方法,用于类之间的比较,比如对类的不同实例进行sort。return self.x * other.y < self.y * other.xclass Solution:def kthSmallestPrimeFraction(self, arr: List[int], k: int) -> List[int]:n = len(arr)q = [Frac(0, i, arr[0], arr[i]) for i in range(1, n)]# heapq是python中的用于实现堆的一个模块heapqify是将列表具有堆特征。heapq.heapify(q)for _ in range(k - 1):frac = heapq.heappop(q)i, j = frac.idx, frac.idyif i + 1 < j:# 将arr[i + 1] / arr[j]放入优先队列中heapq.heappush(q, Frac(i + 1, j, arr[i + 1], arr[j]))return [q[0].x, q[0].y]

二分查找+++双指针

如果我们能找到一个数α\alphaα,恰好有kkk个素数分数小于α\alphaα,那么这些分数中最大的就是我们要找的答案。首先,对于一个α\alphaα,我们如何找到有多少个比它小的素数分数呢?这时我们可以采用双指针。

  • 设定指针jjj来指定分母,从左往右,每次枚举一个分母;
  • 设定指针iii来指定分子,从左往右移动,最小是000,最大是j−1j-1j1,并且移动的过程中,还要保证arr⁡[i]arr⁡[j]<α\frac{\operatorname{arr}[i]}{\operatorname{arr}[j]}<\alphaarr[j]arr[i]<α成立。当iii移动停止后,说明arr⁡[0],⋯,arr⁡[i]\operatorname{arr}[0], \cdots, \operatorname{arr}[i]arr[0],,arr[i]都可以作为分子,即分母为arr⁡[j]\operatorname{arr}[j]arr[j]的小于α\alphaα的素数分数一共有i+1i+1i+1个;
  • jjj向右移动的过程中,将每个jjj对应的i+1i+1i+1累加起来,就是最终的小于α\alphaα的素数分数的个数;
  • 在移动的时候,记录一个当前最大素数分数[x, y];

那么如何找到我们需要的α\alphaα呢?如果上述过程最后的个数等于kkk,那说明选的α\alphaα刚刚好。如果个数小于kkk,那说明当前选取的α\alphaα过小;如果个数大于kkk,那说明当前选取的α\alphaα过大。这很明显,可以用二分查找来寻找最合适的α\alphaα
代码如下:

class Solution:def kthSmallestPrimeFraction(self, arr: List[int], k: int) -> List[int]:n = len(arr)left, right = 0.0, 1.0while True:mid = (left + right) / 2i, count = -1, 0x, y = 0, 1for j in range(1, n):while arr[i + 1] / arr[j] < mid:i += 1if arr[i] * y > x * arr[j]:x, y = arr[i], arr[j]count += i + 1if count == k: return [x, y]if count < k:left = midif count > k:right = mid

最终的时间复杂度为O(nlogC)O(nlogC)O(nlogC)CCC为数组arrarrarr中的元素的上界,二分查找需要⌈log⁡C2⌉=O(log⁡C)\left\lceil\log C^{2}\right\rceil=O(\log C)logC2=O(logC)次。每一步需要O(n)O(n)O(n)的时间得到小于α\alphaα的素数分数的个数。空间复杂度为O(1)O(1)O(1)

http://www.lbrq.cn/news/1598995.html

相关文章:

  • 免费微网站建站系统/my63777免费域名查询
  • 网页版微信登不上去怎么回事/某网站搜索引擎优化
  • 网站确定关键词 如何做/济南网站制作平台
  • 网站制作与网站设计/seo策略分析
  • 网站改版对seo的影响/google关键词挖掘工具
  • 建一个快讯网站要多少钱/seo资讯推推蛙
  • 网站建设 推广/怎么注册网站平台
  • 织梦制作网站如何上线/seo海外
  • 如何做网站链接分享朋友圈/线上营销渠道
  • 江苏建设信息网站有时候打不开/做推广的公司一般都叫什么
  • 网站换空间的流程/宣传网页制作
  • 网站网络推广/百度一下就知道手机版
  • 东莞网站建设关键词/外贸网站制作公司
  • 自己做网站的难度/西安小程序开发的公司
  • 桓台网站/星巴克seo网络推广
  • 苏州市网站制作/北京网站优化对策
  • 做外国网用哪些网站有哪些/注册网站域名
  • 公司做网站做什么类型的网站好/求网址
  • 加强意识形态建设 办好政协网站/网站维护工作内容
  • 贵州网站制作设计公司哪家好/怎么自己做一个网址
  • 群晖nas做网站服务器/安卓优化大师app下载安装
  • 合肥城乡建设网站首页/网络营销推广优化
  • 水车头采集wordpress内容/大侠seo外链自动群发工具
  • 动态网站开发实训总结/bt最佳磁力搜索引擎
  • wordpress调用相关文章/重庆公司seo
  • 做视频小网站犯法吗/德州seo整站优化
  • 英文外贸网站设计/数据分析师35岁以后怎么办
  • 山东省建设节能协会网站/net的网站建设
  • 日本r影片网站做我的奴隶/晚上看b站
  • 折扣券网站怎么做/山东最新消息今天
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(六)
  • 【机器学习深度学习】模型压缩简介
  • Linux网络编程 --- 多路转接select
  • 01数据结构-时间复杂度和空间复杂度
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • 一个网页的加载过程详解