题目
题目分析
- 首先看到题目,不知道大家有没有觉得和两数之和的题目有些相似。最直接的方法就是暴力法,设置三个for循环,时间复杂度为O(n3), 空间复杂度为O(1),此方法虽简单,但是会超过时间限制。代码段如下
//暴力法
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
new_three = []
nums.sort()
for i, j in enumerate(nums):
for m in range(i+1,len(nums)):
for n in range(m+1, len(nums)):
if j+nums[m]+nums[n] == 0:
temp = [j, nums[m], nums[n]]
flag = 0 //判断三元组是否重复的一个标志
for p, q in enumerate(new_three):
if set(q) == set(temp):
flag = 1
if flag == 0:
new_three.append(temp)
return new_three
- 下面介绍第二种方法:
(1)题目中最后要得到三个数,而且不能重复是关键,所以首先我们给nums排序,只需要一个for循环即可,利用for循环确定三个数中的第一个,因为我们已经排好序,如果第一个数大于0,就不需要再去找之后的两个.
(2) 确定了第一个数之后,在nums之后的列表里可以采用双指针,一个头指针m一个尾指针n,有点类似快速排序的思想,用while,如果m>n,结束一次while。代码段如下
//双指针法
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
new_three = []
for i in range(len(nums)-2):
if (i==0 or nums[i]>nums[i-1]) and nums[i]<1:
m = i+1
n = len(nums)-1
while m<n:
if nums[i]+nums[m]+nums[n] == 0:
temp = [nums[i], nums[m], nums[n]]
new_three.append(temp)
if m+1== len(nums)-1:
break
while nums[m+1]==nums[m] and m<n:
if m+1== len(nums)-1:
break
m = m+1
while nums[n-1]==nums[n] and n>m:
n = n-1
n = n-1
m = m+1
elif nums[i]+nums[m]+nums[n] > 0:
n=n-1
elif nums[i]+nums[m]+nums[n] < 0:
m=m+1
return new_three
每天一点进步,加油!。1
@Qichao ↩︎