原题指路
解题思路
刚开始看到这道题的时候,我大意了,以为简单题就可以直接双重循环暴力通过,然而……
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))