Leetcode 3649. Number of Perfect Pairs
Leetcode 3649. Number of Perfect Pairs
·
1. 解题思路
这一题首先我们需要明白,选择的两个数的实际的位置与结果是没有关系的,因此,我们不妨将所有的数字顺序排列,然后令取到的两个数 a , b a,b a,b满足大小关系 a ≤ b a\leq b a≤b。
此时,我们分类讨论,考察 a a a在不同的情况下对应的满足条件的 b b b的取值范围,有如下情况:
大小关系 | b b b的取值范围 |
---|---|
0 ≤ a ≤ b 0 \leq a \leq b 0≤a≤b | a ≤ b ≤ 2 a a \leq b \leq 2a a≤b≤2a |
a ≤ 0 ≤ b a \leq 0 \leq b a≤0≤b | − a 2 ≤ b ≤ − 2 a -\frac{a}{2} \leq b \leq -2a −2a≤b≤−2a |
a ≤ b ≤ 0 a \leq b \leq 0 a≤b≤0 | a ≤ b ≤ a 2 a \leq b \leq \frac{a}{2} a≤b≤2a |
然后,我们只需要考察每一个元素作为 a a a的情况下对应的 b b b的取法个数,然后将其相加即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def perfectPairs(self, nums: List[int]) -> int:
nums = sorted(nums)
n = len(nums)
ans = 0
for i, a in enumerate(nums):
if a < 0:
l = bisect.bisect_left(nums, -a/2)
r = bisect.bisect_right(nums, -2*a)
if r < n and nums[r] == -2*a:
r += 1
ans += r-l
l = max(bisect.bisect_left(nums, a), i)
r = bisect.bisect_right(nums, a/2)
if r < n and nums[r] == a/2:
r += 1
ans += r-l-1
else:
l = max(bisect.bisect_left(nums, a), i)
r = bisect.bisect_right(nums, 2*a)
if r < n and nums[r] == 2*a:
r += 1
ans += r-l-1
return ans
提交代码评测得到:耗时963ms,占用内存30.88MB。
更多推荐
所有评论(0)