15. 三数之和
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if not nums:
return []
n = len(nums)
if n < 3:
return []
res = []
nums.sort()
for i in range(n):
if nums[i] > 0:
return res
if i > 0 and nums[i] == nums[i-1]:
continue
L = i + 1
R = n - 1
while L < R:
if nums[i] + nums[L] + nums[R] == 0:
res.append([nums[i], nums[L], nums[R]])
while L < R and nums[L] == nums[L+1]:
L += 1
while L < R and nums[R] == nums[R-1]:
R -= 1
L += 1
R -= 1
elif nums[i] + nums[L] + nums[R] > 0:
R -= 1
else:
L += 1
return res
思路:
先排序,然后固定第一个数,后面两个数使用双指针,从数组的两侧往中间移动。遇到重复值跳过。
排序时间复杂度O(nlogn),第一个数遍历是O(n),后面双指针遍历是O(n),整个后面部分的遍历是O(n^2)。
综上,时间复杂度O(n^2),空间复杂度O(1)。
注意点:
无。