三数和算法及其思考

三数和算法

1、三重循环 去获取每次值相加,获取到相对应的值

缺点:虽然简单实现,但是复杂度为n3,时间比较复杂

2、循环加双指针 先排序 然后外层循环 内层用双指针的模式去遍历和比较

相对而言 减少了一层循环,且比较过程中可以部分剪枝

变种:三数和最接近target的算法

思考:我们拿到一个题目的时候,遇到不熟悉的内容的时候经常会首先想到蛮干,然后写出来的内容就显得相对比较冗余和复杂。实际上我们应该首先把题干和结论用相对比较简洁的语言重新表述,比如符号,然后推理要实现的步骤,写一些简单伪代码,然后从中看是否有我们能够联想或者思考到的剪枝或者偷懒方法,即优化的思路。

附实现的python代码:

def three_num2(nums):
'''
三数之和为0
:param nums:
:return:
先排序
然后首尾同号则肯定大于0
处理相同的数字
左边正数也肯定大于0
'''
nums.sort()
n_len = len(nums)
lst = []
i = 0
while i < n_len:
if nums[i] > 0: break # 左边正数 则退出
first = i + 1
last = n_len - 1
while first < last:
if first >= last or nums[i] * nums[last] > 0: break
result = nums[i] + nums[first] + nums[last]
if result == 0:
lst.append([nums[i], nums[first], nums[last]])
if result <= 0:
while first < last and nums[first] == nums[first + 1]:
first += 1
first += 1
else:
while first < last and nums[last] == nums[last - 1]:
last -= 1
last -= 1
while nums[i] == nums[i+1]: i +=1
i += 1
print(i)
return lst

猜你喜欢

转载自www.cnblogs.com/shuliyuanshi/p/12663009.html