leetcode_15. 三数之和

题目

leetcode题目链接

思路分析

题目要求:在数组中查找和为0的3个元素(不能重复)
找3个元素和为0,3层循环,暴力破解肯定不行。
如果是找2个元素,比较简单,用字典。找3个,没思路。

思路分析(改进.1)

参考博客https://blog.csdn.net/a_learning_boy/article/details/85171316

  1. 先对数组进行排序
  2. 最外一层循环,i 走一遍,作为第一个元素
  3. 在最外一层循环内,left 和 right 分别向中间靠拢。
  4. 还要避免重复

代码展示.1

    def threeSum(self, nums):
    	res = []
    	nums.sort()		##先对元素进行排序
    	i = 0
    	numslen = len(nums)
    	while i<numslen-2:	#以i为找到的第一个元素为基准
    		if nums[i]>0:
    			break
    		left=i+1
    		right=len(nums)-1	#left和right指针指向另外2个指针
    		while left<right:	#left向右,right向左
    			iszero = nums[i]+nums[left]+nums[right]
    			if iszero==0:	#如果找到,append
    				res.append([nums[i],nums[left],nums[right]])
    				left+=1
    				right-=1
    			elif iszero>0:	#和大于0,right向左
    				right-=1
    			else:			#和小于0,left向右
    				left+=1
    		i+=1
    	s = []			#筛选去掉重复元素
    	for i in res:
    		if i not in s:
    			s.append(i)
    	return s

代码展示.1结果

在这里插入图片描述

思路分析(改进.2)

要在整个思路框架中,解决判断重复的问题。

代码展示.2

    def threeSum2(self, nums):
    	res = []
    	nums.sort()
    	i = 0
    	numslen = len(nums)
    	while i<numslen-2:
    		if nums[i]>0:
    			break
    		if i>0 and nums[i]==nums[i-1]:	#会冲突,直接跳过
    			i+=1
    			continue
    		left=i+1
    		right=len(nums)-1
    		while left<right:
    			iszero = nums[i]+nums[left]+nums[right]
    			if iszero==0:
    				res.append([nums[i],nums[left],nums[right]])
    				#会冲突,直接跳过
    				while left<right and nums[left+1]==nums[left]:
    					left+=1
    				#会冲突,直接跳过
    				while left<right and nums[right-1]==nums[right]:
    					right-=1
    				left+=1
    				right-=1
    			elif iszero>0:
    				right-=1
    			else:
    				left+=1
    		i+=1
    	return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值