第一眼望过去 暴力O(n^3),反手就是TLE。
然后想了想 降低复杂度,首先排序一遍O(nlog(n)),然后两层循环;
第一层用于选择第一个值,第二层枚举两个端点,一个(begin)从左往右,另一个(end)从右往左。当begin>=循环完毕在这期间判断nums[i] + nums[begin] + nums[end] 的和是否为0.
注意重复值的判断
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
a = []
b = []
nums.sort()
for i in range(len(nums)-2):
begin = i + 1
end = len(nums) -1
while begin < end:
cnt = nums[begin] + nums[end] + nums[i]
if cnt == 0:
b.append(nums[i])
b.append(nums[begin])
b.append(nums[end])
b.sort()
if b not in a: #自以为是的用not in 来判重,再次一发TLE打脸
a.append(b)
b = []
begin += 1
end -= 1
elif cnt < 0:
begin += 1
else:
end -= 1
return a
终于不再TLE的说
"""
因为是排序过得数组,所以在第一层for中,如果nums[i]在之前出现过,那么后续的查找过程中必定会出现重复,此时应该直接跳出循环
"""
class Solution:
# @param {integer[]} nums
# @return {integer[][]}
def threeSum(self, nums):
a = []
b = []
nums.sort()
a.append([1, 1, 1]) #添加一个错误的答案使得a列表不为空
for i in range(len(nums)-2):
print(i)
if i > 0 and nums[i] == nums[i-1]: #因为是排序过得数组,所以在第一层for中,如果nums[i]在之前出现过,那么后续的查找过程中必定会出现重复,此时应该直接跳出循环
continue
begin = i + 1
end = len(nums) -1
#a.append([1,1,1])
while begin < end:
cnt = nums[begin] + nums[end] + nums[i]
if cnt == 0:
# print("dadad")
b.append(nums[i])
b.append(nums[begin])
b.append(nums[end])
if b != a[len(a)-1]: #排序过得数组,所以在固定第一个元素的情况下,若出现相同的答案那么必定是已经加入到a中的最后一个元素
#b.sort()
a.append(b)
b = []
begin += 1
end -= 1
elif cnt < 0:
begin += 1
else:
end -= 1
return a[1:] #去掉第一个错误答案