Python三数之和的实现方式
三数之和题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,
使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
答案中不允许包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
思路
1. 首先将数组排序,可以利用Python内置函数,也可以利用另外定义排序算法。
2. 应用双指针算法。固定第一个数,索引为i,遍历整个数组,第一个数也是三个数中最小的数,然后在该数右面设置左右两个指针l和r,l=i+1,r=len(nums)-1,
3. 判断这三个索引指向的元素和与0的大小关系。
和>0,右指针左移一位;和<0,左指针右移一位。
由于要避免重复的三元组,所以移动左右指针的时候要跳过相邻的所有相等的nums[i]。
Python3代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #导入计算时间的包,调用系统时间 from time import * #初始时间 t1 = time() def threeSum(nums): nums.sort() n = len (nums) res = [] for i in range (n): '''如果相邻的两个数相等,跳过,避免重复''' if i > 0 and nums[i] = = nums[i - 1 ]: continue l, r = i + 1 , n - 1 while l < r: if nums[i] + nums[l] + nums[r]> 0 : r - = 1 while nums[r + 1 ] = = nums[r]: r - = 1 elif nums[i] + nums[l] + nums[r]< 0 : l + = 1 while nums[l - 1 ] = = nums[l]: l + = 1 else : res.append([nums[i],nums[l],nums[r]]) l + = 1 r - = 1 while nums[l] = = nums[l - 1 ]: l + = 1 while nums[r] = = nums[r + 1 ]: r - = 1 return res if __name__ = = '__main__' : nums = [ - 1 , 0 , 1 , 2 , - 1 , - 4 ] print (threeSum(nums)) #结束时间 t2 = time() #运行时间 run_time = t2 - t1 print (run_time) |
运行结果:
[[-1, -1, 2], [-1, 0, 1]]
#运行时间
0.0010113716125488281
以上代码有一些思想错误:
遗漏了如果三个数全部大于0,则退出循环,因为没有满足条件的结果。
没有严格判断每一次的l<r的条件。
修正后的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | from time import * t1 = time() def threeSum(nums): nums.sort() n = len (nums) res = [] for i in range (n - 2 ): if nums[i] > 0 : break '''如果相邻的两个数相等,跳过,避免重复''' if i > 0 and nums[i] = = nums[i - 1 ]: continue l, r = i + 1 , n - 1 while l < r: if nums[i] + nums[l] + nums[r]> 0 : r - = 1 while l < r and nums[r - 1 ] = = nums[r]: r - = 1 elif nums[i] + nums[l] + nums[r]< 0 : l + = 1 while l < r and nums[l] = = nums[l - 1 ]: l + = 1 else : res.append([nums[i],nums[l],nums[r]]) l + = 1 r - = 1 while l < r and nums[l] = = nums[l - 1 ]: l + = 1 while l < r and nums[r] = = nums[r + 1 ]: r - = 1 return res if __name__ = = '__main__' : nums = [ - 2 , - 3 , 0 , 0 , - 2 ] print (threeSum(nums)) t2 = time() run_time = t2 - t1 print (run_time) |
结果:
[]
#时间
0.0
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Python内建函数之raw_input()与input()代码解析
这篇文章主要介绍了Python内建函数之raw_input()与input()代码解析,具有一定参考价值,需要的朋友可以了解下。2017-10-10
最新评论