LeetCode 15. 三数之和python3
原题链接
中等
作者:
xanxus1111
,
2020-06-12 15:29:04
,
所有人可见
,
阅读 499
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ans = []
counts = {}
for i in nums: #记录没个数值的个数
counts[i] = counts.get(i, 0) + 1
nums = sorted(counts) #排序
for i, num in enumerate(nums):
if counts[num] > 1: #先找到一个数出现次数大于1的
if num == 0:
if counts[num] > 2: #如果有三个以上0 则存入
ans.append([0, 0, 0])
else:
if -num * 2 in counts: #如果有两个 num 那么找一个-2num抵消之
ans.append([num, num, -2 * num])
if num < 0: #如果小于0
two_sum = -num #找到相反数
#用bisect查找下标,缩短遍历长度
left = bisect.bisect_left(nums, (two_sum - nums[-1]), i + 1)#从i到结尾的片段中插入目标数后,返回目标数的下标 如果下标小于i+1那么返回i+1
# print(left,two_sum,nums[-1],i+1)
for i in nums[left: bisect.bisect_right(nums, (two_sum // 2), left)]:#从找到的下标开始遍历nums中的数,查看是否能找到对应的j
j = two_sum - i #算出j(i+j)等于two_sum
if j in counts and j != i: #如果i,j不重叠,且j存在于nums里,那么加入答案列表
ans.append([num, i, j])
return ans