- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目描述
给定一个包含?n?个整数的数组?nums,判断?nums?中是否存在三个元素?a,b,c ,使得?a + b + c =?0 ?找出所有满足条件且不重复的三元组。
解题思路:
1、先排序,从小到大开始
2、最外层使用for循环, 从0到 len(nums),全部走一遍
3、每循环一次,i位置数 和 后面的数中查询两个数,使得三个数的和为0
4、后面的两个数可以定位i位置的后一个数 L 和数列中最后一个数 R
5、根据三个数的和结果,如果刚好是0,则 L+1, R-1 再找一组解
6、如果和的结果 大于0,右边的值向左移动 ,即R-1
7、如果和的结果 小于0,左边的值向右移动, 即 L+1
8、以上操作中, 可以需要多次执行(While循环),退出的条件是L R
代码如下:
class Solution(object):
def threeSum(self, nums):
nums.sort() # 排序
res = []
for i in range(len(nums)): # 遍历每一个数
if i == 0 or nums[i] nums[i - 1]: # 确定不重复的数字(开头)
l = i + 1
r = len(nums) - 1
while l r: # 左边的位置 必须小于 右边的位置
s = nums[i] + nums[l] + nums[r] # 三个数的和
if s == 0:
res.append([nums[i], nums[l], nums[r]])
# 再找下一组解
l += 1
r -= 1
# 左边向右移动到不重复数为止
while l r and nums[l] == nums[l - 1]: l += 1
# 右边向左边移动不重复数为止
while r l and nums[r] == nums[r + 1]: r -= 1
elif s 0:
r -= 1
else:
l += 1
return res
测试代码
nums =
[
[-1, 0, 1, 2, -1, -4],
[-4, -1, -1, 0, 1, 2, 4],
[-5, -3, -2, 0, 1, 2, 2, 3],
[1, 2, -2, -1],
[0, -4, -1, -4, -2, -3, 2],
[0,1,1],
[0,0,0],
[4, 0, 2, 3, -1],
[3, 0, -2, -1, 1, 2],
[-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6],
[-1, -2, -3, 4, 1, 3, 0, 3, -2, 1, -2, 2, -1, 1, -5, 4, -3],
[-4, -2, 1, -5, -4, -4, 4, -2, 0, 4, 0, -2, 3, 1, -5, 0]
]
for datas in nums:
print(Solution().threeSum(datas))
更多课程咨询可找任姐姐哦:1976279437
原创力文档


文档评论(0)