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