题目地址: https://www.hackerrank.com/challenges/pairs/problem?isFullScreen=false
翻译:返回list中任意两元素差值绝对值=k的最大组合数。例子如下:
难度:Medium
解题
正常做法:先输出全部长度为2的组合,再遍历两两求差比较。
from itertools import combinations
def pairs(k, a):
# Write your code here
temp = [i for i in combinations(arr, 2)]
r = [ 1 if abs(i[0] - i[1]) == k else 0 for i in temp]
return sum(r)
耗时严重无法通过全部case。换个思路,先排序,然后两个指针遍历两两组合,当差值≥k的时候break,并且计数+1。
def pairs(k, a):
# Write your code here
ct = 0
a.sort()
for i in range(len(a) - 1):
for j in range(0, len(a)):
if a[j] - a[i] > k:
break
elif a[j] - a[i] == k:
ct += 1
break
return ct
通过了一部分case,仍然有部分无法通过。再进一步优化,充分利用排序后的数组,当差值=k时,break之后 j 没必要再从0开始遍历。
def pairs(k, a):
# Write your code here
ct = 0
a.sort()
st = 1
for i in range(len(a) -1 ):
for j in range(st, len(a)):
if a[j] - a[i] > k:
break
elif a[j] - a[i] == k:
ct += 1
st = j+1
break
return ct
搞定完事。