1. 解题思路

这一题首先我们需要明白,选择的两个数的实际的位置与结果是没有关系的,因此,我们不妨将所有的数字顺序排列,然后令取到的两个数 a , b a,b a,b满足大小关系 a ≤ b a\leq b ab

此时,我们分类讨论,考察 a a a在不同的情况下对应的满足条件的 b b b的取值范围,有如下情况:

大小关系 b b b的取值范围
0 ≤ a ≤ b 0 \leq a \leq b 0ab a ≤ b ≤ 2 a a \leq b \leq 2a ab2a
a ≤ 0 ≤ b a \leq 0 \leq b a0b − a 2 ≤ b ≤ − 2 a -\frac{a}{2} \leq b \leq -2a 2ab2a
a ≤ b ≤ 0 a \leq b \leq 0 ab0 a ≤ b ≤ a 2 a \leq b \leq \frac{a}{2} ab2a

然后,我们只需要考察每一个元素作为 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。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐