思路:
这个题有点难,如果暴力算法一定超时,然后采用了双指针,但是考虑方面有点多,要先排序,再排除一些不可能的情况,再讨论去重(分别在k,j,i)再进行定k,同时i和j进行双指针算法,i进行i++,j进行j–
组织以后:先顺序排序,再从头到尾,循环取一个值(k),作为三数之一。 循环内,另外两个数(i和j),分别从左边最近的(i),以及最后的(j)开始取值,求和。 和为0,则加入结果数组,同时两数向内分别移动,并判断去重。 和大于0,则后面的数前移,同样判断去重。 和小于0,则前面的数后移,同样判断去重。 最后,递增第一个数下标的同时,判断去重。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result,k=[],0
for k in range(len(nums)-2):
if nums[k]>0:
break
if k >0and nums[k] == nums[k-1]:
continue
i,j=k+1,len(nums)-1
while i
s=nums[k]+nums[i]+nums[j]
if s<0:
i+=1
while i
i+=1
elif s > 0:
j -=1
while i
j -= 1
else:
result.append([nums[k],nums[i],nums[j]])
i+=1
j-=1
while i < j and nums[i]==nums[i-1]:
i+=1
while i
j-=1
return result
标签:判断,15,nums,int,三数,List,len,力扣,while
来源: https://blog.csdn.net/lvjiwei001/article/details/104650196