LC15 - 三数之和

LeetCode - 15.三数之和

题目

三数之和

思路

题目要求答案中不包含重复的三元组,即要对结果进行去重。
首先对数组进行排序,方便去重。正因为是有序的,我们采用“定一移二”的思想,即双指针法。

代码

func threeSum(nums []int) [][]int {
    
    
 	// 排序
	sort.Ints(nums)
	// 结果储存
	var result [][]int
	
	// 注意下标控制
	for i := 0; i < len(nums) - 2;i ++ {
    
    
		n1 := nums[i]
		// 因为是已经排序的,如果n1大于0 说明不可能有满足条件的组合 直接跳出
		if n1 > 0 {
    
    
			break
		}
		// 如果n1已经使用过了,那么后面与n1大小相同的直接跳过,以防出现重复答案
		if i > 0 && n1 == nums[i - 1] {
    
    
			continue
		}
		// left, right指针
		left, right := i + 1, len(nums) - 1
		for left < right {
    
    
			n2, n3 := nums[left], nums[right]
			if n1 + n2 + n3 == 0 {
    
    
				// 满足条件 存储结果
				result = append(result, []int{
    
    n1, n2, n3})
				// left后面如果有和left相同的数就会导致重复,这里我们做个判断,去重
				for left < right && nums[left] == n2 {
    
    
					left ++
				}
				for left < right && nums[right] == n3 {
    
    
					right --
				}
			} else if n1 + n2 + n3 < 0 {
    
    
				// 指针右移
				left ++
			} else {
    
    
				// 指针左移
				right --
			}
		}
	}

	return result
}

拓展

三数之和这道题使用排序+双指针,LC第一道题两数之和官方题解中给的双层遍历哈希法,如果要使用双指针法来解决两数之和,题目就必须得有数组有序这个条件,有序是使用双指针的基础

猜你喜欢

转载自blog.csdn.net/qq_44336650/article/details/120903819
今日推荐