前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 三数之和

Leetcode 三数之和

作者头像
月梦@剑心
发布2023-08-31 10:55:56
1560
发布2023-08-31 10:55:56
举报
文章被收录于专栏:月梦·剑心的技术专栏

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

解法

三数之和如何去重是一个比较棘手的问题,在考虑的时候分别考虑对三个数的去重:

对于第一个数,如果遇到相同的直接跳过即可。但是注意应该使用

代码语言:javascript
复制
if i > 0 && nums[i] == nums[i - 1] {
  continue
}

而不是

代码语言:javascript
复制
if nums[i] == nums[i + 1] {
  continue
}

使用第二种写法会直接使得[-1, -1, 2]这种情况漏掉

对于第二个第三个数,略过所有重复的第二个和第三个数,考虑[0, 0, 0, 0]这种情况

代码

代码语言:javascript
复制
func threeSum(nums []int) [][]int {
	// 存放答案
	result := [][]int{}
	// 排序
	sort.Ints(nums)
	// nums长度
	n := len(nums)
	for i := 0; i < n-2; i++ {
		a := nums[i]
		// 如果第一个数就比0大,就跳出
		if a > 0 {
			break
		}
		if i > 0 && nums[i] == nums[i-1] {
			continue
		}
		// 找第二个数的指针
		leftP := i + 1
		// 找第三个数的指针
		rightP := n - 1
		for leftP < rightP {
			if a+nums[leftP]+nums[rightP] == 0 {
				//找到了一个三元组
				result = append(result, []int{a, nums[leftP], nums[rightP]})
				//为后两个数去重,防止找到重复的
				leftP++
				for leftP < rightP && nums[leftP] == nums[leftP-1] {
					leftP++
				}
				rightP--
				for leftP < rightP && nums[rightP] == nums[rightP+1] {
					rightP--
				}
			} else if a+nums[leftP]+nums[rightP] > 0 {
				rightP--
			} else {
				leftP++
			}
		}
	}
	return result
}

性能:

代码语言:javascript
复制
执行用时:40 ms, 在所有 Go 提交中击败了94.49%的用户
内存消耗:7.4 MB, 在所有 Go 提交中击败了70.64%的用户
通过测试用例:312 / 312
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三数之和
  • 解法
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档