leetcode(15) :三数之和类题目

一、三数之和问题解析

1、问题描述
中文版刷题链接.
leetcode(15) :三数之和类题目_第1张图片
2、解题思路
思路一:暴力破解,从数组中任意取三个数,判断他们和是否为0,穷举所有可能。
Golang版本代码如下:

func threeSum(nums []int) [][]int {
    result := make([][]int,0)
    length := len(nums)
    for i:=0;i

出现的问题:
时间复杂度太高O(n3),还不符合题意,题目要求不重复的组合。
leetcode(15) :三数之和类题目_第2张图片
思路二、题目要求去除重复组合,比较容易做到的就是先排序,然后从头到尾不重复遍历。针对每一次遍历,选取一个数a[i],然后在剩下的排好序数组a[i+1:]中取两个数之和等于-a[i],那么三数之和问题就转变成了两数之和
处理两数之和问题也可以用暴力破解,但是有一种更快的,在排序的数组上,用一个头指针和一个尾指针,两个指针依照一定的规则往中间遍历。
Golang代码如下:

func threeSum(nums []int) [][]int {  
    result := make([][]int,0) 
    length := len(nums)
    //先排序
    sort.Ints(nums)
    for i:=0;i0 && nums[i] == nums[i-1]{ //避免重复计算
            continue
        }     
        begin := i+1
        end := length -1  
        for begin < end {
            twoSum:= nums[begin] + nums[end]  
            if twoSum == -nums[i] {
                result = append(result,[]int{nums[i],nums[begin],nums[end]})
                for begin -nums[i]{
                for begin

3、举一反三
三数之和问题其实可以衍生出很多类似问题,比如4数、N数之和为定值等等,解决方法有点像降阶,N数之和转换为N-1数之和… ,最终转换成2数之和。

还有一种问题是返回满足条件的数的数组下标,数组一排序下标肯定打乱了,一种处理方法是额外用一个map记录原数组的数与下标对应关系。

你可能感兴趣的:(leetcode)