三数和算法
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
原文地址:https://www.cnblogs.com/shuliyuanshi/p/12663009.html
时间: 2024-10-12 19:16:58