采购方案

本文介绍了一种解决采购方案问题的方法,通过排序和二分搜索降低时间复杂度至O(nlogn),避免了暴力遍历导致的时间消耗。代码中展示了如何在给定零件价格列表和目标总价的情况下,找出所有不超过预算的零件组合数量。最终结果对大整数取模,确保答案在给定范围内。
摘要由CSDN通过智能技术生成

原题指路

采购方案

解题思路

图片1.png
刚开始看到这道题的时候,我大意了,以为简单题就可以直接双重循环暴力通过,然而…… O ( n 2 ) O(n^2) O(n2)的做法果然被卡住了。因此,这道题需要至少 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)的做法来解决,因此采用先排序而后二分搜索的方法来进行解决。

时间复杂度: O ( n log ⁡ n ) O(n\log{n}) O(nlogn)(排序和主循环体均为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)

代码

class Solution:
    def purchasePlans(self, nums: list[int], target: int) -> int:
        cnt = 0
        nums.sort()  # 排序
        for i in range(len(nums)):
            if 2 * nums[i] > target:  # 说明当前零件后面已经没有与它匹配的不超过预算的零件
                break
            j = bisect.bisect_right(nums, target - nums[i])  # 二分法找到最后一个与当前零件匹配的不超过预算的零件
            cnt += (j - i - 1)
        return int(cnt % (1e9 + 7))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值