leetcode 15.三数之和 golang实现

描述
给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路
先对nums排序
1. 先固定一个数nums[i], 然后从l = i+1 和r=len -1 的位置分别向后和向前遍历, 中间遍历的时候 将重复的数去掉即可
2. 判断三个数相加是否
=0 时 l=l+1 r=r-1
<0 时则l = l+1 
>0 时 r = r-1
3. 如果nums[i] > 0 时则肯定不可能=0
实现
type TypeSlice []int

func (s TypeSlice) Len() int           { return len(s) }
func (s TypeSlice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
func (s TypeSlice) Less(i, j int) bool { return s[i] < s[j] }

// 三数之和
func threeSum(nums []int) [][]int {
	var sortSlice = TypeSlice(nums)
	var rets = make([][]int, 0)
	var length = len(nums)

	sort.Sort(sortSlice)
	nums = []int(sortSlice)

	for i:=0; i < length; i++{
		if nums[i] > 0{
			break
		}

		if i - 1 >= 0 && nums[i - 1] == nums[i] {
			continue
		}

		l := i + 1
		r := length - 1

		for l < r{
			if nums[i] + nums[l] + nums[r] == 0{
				println(fmt.Sprintf("1:l=%d, r=%d", l, r))
				rets = append(rets, []int{nums[i], nums[l], nums[r]})

				for l < r{
					if nums[l] == nums[l + 1]{
						l += 1
					}else{
						break
					}
				}

				for l < r{
					if nums[r] == nums[r - 1]{
						r -= 1
					}else{
						break
					}
				}

				l += 1
				r -= 1
			}else if nums[i] + nums[l] + nums[r] > 0{
				r -= 1
			}else if nums[i] + nums[l] + nums[r] < 0{
				l += 1
			}

		}
	}
	return rets
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值