三数和算法及其思考

Posted shuliyuanshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三数和算法及其思考相关的知识,希望对你有一定的参考价值。

三数和算法

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

 

以上是关于三数和算法及其思考的主要内容,如果未能解决你的问题,请参考以下文章

[LintCode/LeetCode]——两数和三数和四数和

三数和的问题

23.3Sum(三数和为零)

Sum Zero Problem(三数和为0, 破解三重for循环问题)

代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和