LeetCode15:三数之和(Python+Golang)

LeetCode15:三数之和(Python+Golang)

题目

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

方法分析

1.暴力法:a.b.c->3层循环 O(n^3)
2.c=-(a+b) =>set() O(1)<c查询>, O(n^2)
3.数组排序(快排)->O(nlogn)
3.1 loop(a),b从起点开始,c从末尾开始,再用a+b+c大于小于0来判断b和c右移还是左移

Python实现

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums)<=2:return []
        res = []
        num_len = len(nums)
        nums.sort()
        # 保留两位留作判断
        for i,v in enumerate(nums[:-2]):
            if i>0 and v == nums[i-1]:
                continue
            l,r = i+1,num_len-1
            while l<r :
                target_n = nums[l]+nums[r]+v
                if target_n >0:r-=1
                elif target_n<0:l+=1
                else:
                    res.append([v,nums[l],nums[r]])
                    while l<r and nums[l]==nums[l+1]:
                        l+=1
                    while l<r and nums[r]==nums[r-1]:
                        r-=1
                    r-=1
                    l+=1
        return res

Golang实现

func threeSum(nums []int) [][]int {
    var res [][]int
	if len(nums) <= 2 {
		return res
	}
    num_len := len(nums)
	sort.Ints(nums)
	for i, v := range nums[:num_len-2] {
		if i > 0 && v==nums[i-1] {
			continue
		}
		l := i + 1
		r := num_len - 1
		for l < r {
			target_n := nums[l] + nums[r]+v
			switch {
            case target_n > 0:
				r -= 1
			case target_n < 0:
				l += 1
			case target_n == 0:
				res = append(res, []int{v, nums[l], nums[r]})
				for l < r && nums[l] == nums[l+1] {
					l += 1
				}
				for l < r && nums[r] == nums[r-1] {
					r -= 1
				}
				r -= 1
				l += 1
			}
		}
	}
	return res
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值