leetcode 15. 三数之和

112 阅读1分钟

力扣题目链接

三数之和。这道题要在 两数之和扩展题 的基础上实现(已提交通过)。

import "sort"

// 找三个数。
func threeSum(nums []int) [][]int {
	length := len(nums)
	if length < 3 {
		return nil
	}
	sort.Sort(sort.IntSlice(nums)) // 排序
	var res [][]int
        r := length-1
	for i := 0; i < length; {
		n := nums[i]
		res = twoSum(nums, i+1, r, -n, n, res)
		for i < length && nums[i] == n { // 去重
			i++
		}
	}
	return res
}

// 找两个数。
// 在nums的索引区间[l,r]找和为target的两个数
func twoSum(nums []int, l, r, target, first int, res [][]int) [][]int {
        for l < r {
		lv := nums[l]
		rv := nums[r]
		sum := lv + rv
		if sum == target {
			res = append(res, []int{first, lv, rv})
		}
		if sum <= target {
			for l < r && nums[l] == lv { // 去重
				l++
			}
		}
		if sum >= target {
			for l < r && nums[r] == rv { // 去重
				r--
			}
		}
        }
        return res
}

原题是找到和为0的三元组,可以稍做扩展:找到和为指定target值的三个数。即实现函数func threeSum(nums []int, target int) [][]int。读者可自行实现。