最强解析面试题:和为N的三个数字

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最强解析面试题:和为N的三个数字相关的知识,希望对你有一定的参考价值。


最强解析面试题:和为N的三个数字

文章讲解 “ 和为N的三个数字 ” 经典面试题,包含思路及源码,及解惑!

题目

和为N的三个数字。

思路

思路同前篇:和为S的两个数字,先固定一个,计算后两个。

  • 利用数组的非递减序,进行首尾同时便利,若之和超过给定值,则尾指针递减,反之首指针递增。
  • 排序之后可解决三数字集合重复的问题,注意每个数字都要进行判断去重

代码

package main

import (
"fmt"
"sort"
)
func main() {
    //var arr = []int{5,7,6,9,11,10,8}
}
func Res() [][]int {
    var res [][]int
    var intArr = []int{-1, 0, 1, 2, -1, -4}
    tar := 0
    sort.Ints(intArr)
    for k := 0; k < len(intArr); k++ {
        if intArr[k] > 0{
            break
        }
        if k > 0 && intArr[k] == intArr[k-1] {
            continue
        }
        i := k + 1
        j := len(intArr) - 1
        for ; i < j; {
            if intArr[i]+intArr[j]+intArr[k] > tar {
                j--
            }else if intArr[i]+intArr[j]+intArr[k] < tar {
                i++
            }else{
                var tmp = []int{intArr[i], intArr[j], intArr[k]}
                res = append(res, tmp)
                i++
                j--
                for {
                    if i < j && intArr[i] == intArr[i-1] {
                        i++
                    }else{
                        break
                    }
                }
                for {
                    if i < j && intArr[j] == intArr[j+1] {
                        j--
                    }else{
                        break
                    }
                }
            }
        }
    }
    return res
}

附录

忙碌

以上是关于最强解析面试题:和为N的三个数字的主要内容,如果未能解决你的问题,请参考以下文章

最强解析面试题:旋转数组的最小数字

最强解析面试题:最小 K 个数

最强解析面试题:硬币计算 动态规划

最强解析面试题:接雨水...

最强解析面试题:最大连续和

最强解析面试题:裴波那契数列「建议收藏!」