【Leetcode】786. K-th Smallest Prime Fraction 786. 第 K 个最小的素数分数

本文介绍了一种使用二分搜索算法寻找有序数组中第K小的分数的方法。重点在于如何快速确定小于某个中间值的分数数量,以及找到最接近该值的分数。通过不断调整搜索范围直至找到目标分数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1

解法

虽然可以用堆来解,但是还是二分搜索比较快
主要是要判断有多少个分数小于mid,并且离mid最接近的那个分数是谁
一开始没想到上界是啥,傻了,上界设成1就行了

class Solution(object):
    def kthSmallestPrimeFraction(self, A, K):
        """
        :type A: List[int]
        :type K: int
        :rtype: List[int]
        """            
        n = len(A)
        def guess(m):
            a=b=None
            c = n
            res = 0
            for r in xrange(n-1,0,-1):
                c = min(c,r-1)
                tar = A[r]*m
                while c>=0 and A[c]>tar:
                    c -= 1
                res += c+1
                if c>=0 and (a==None or a*A[r]<A[c]*b):
                    a = A[c]
                    b = A[r]
            return res, a,b
        l,r = 0,1
        while l<r:
            mid = (l+r)/2.0
            d,a,b = guess(mid)
            if d>K:
                r = mid
            elif d<K:
                l = mid
            else:
                return a,b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值