三数之和这里我是将用最暴力的三重循环来检验x + y = -z,然后排序过后输出,但是这样时间复杂度为O(n^3) ,LeetCode检验超时。。。,所以参考了一下大佬的算法,这样时间复杂度就变成了O(n^2),但是有时提交还是超时,这对时间复杂度要求也太高了吧。。。
- 我的垃圾算法
result = []
for i in range(len(nums)):
x = nums[i]
for j in range((i + 1),len(nums)):
y = nums[j]
for k in range((j + 1),len(nums)):
z = nums[k]
if x + y == -z:
temp = [x,y,z]
temp.sort()
if temp not in result:
result.append(temp)
result.sort()
return result
- 大佬的算法
nums.sort()
result = []
i = 0
for i in range(len(nums)):
if i == 0 or nums[i] > nums[i - 1]:
left = i + 1
right = len(nums) - 1
while left < right:
res = nums[i] + nums[left] + nums[right]
if res == 0:
result.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
#防止相同数
while left < right and nums[left] == nums[left - 1]:
left += 1
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif res > 0:
right -= 1
elif res < 0:
left += 1
return result
这个算法的思想是先将数据进行排序,确定一个数x,然后用指针left指向小数,指针right指向大数,若x + nums[left] + nums[right]大于0,则right指针右移,小于0则left指针左移,去除相同数则通过判断指针与上一个数是否相同来判断。