1. 解题思路
这道题说来惭愧,没能自己搞出来,是看了大佬们的解答之后才恍然大悟的,不过思路上委实是有些巧妙了,想到了就很简单,想不到就有的麻烦了……
本质上来说,这里的思路其实就是利用了两个显而易见性质:
- 两个整数的和是 k k k,那么如果一个数是 x x x,另一个数显然就是 k − x k-x k−x,且 x x x范围在 [ 0 , k ] [0,k] [0,k];
- 如果
x^y=a
,则x=a^y
;
由于题目中限定了 k k k的范围在 0 0 0到 100 100 100,并不是很大,因此我们只需要遍历一下每一个坐标作为第二个坐标时,其第一个坐标可能的选择即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def countPairs(self, coordinates: List[List[int]], k: int) -> int:
cnt = Counter()
res = 0
for x, y in coordinates:
for t in range(k+1):
dx = t^x
dy = (k-t)^y
res += cnt[(dx, dy)]
cnt[(x, y)] += 1
return res
提交代码评测得到:耗时1612ms,占用内存30.8MB。