给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
很久没写博客了,主要技术菜 没东西写....... 刷着leetcode题目,刷完三数之和到四数之和, 脑袋想, 万一哪天leetcode来个五数之和, 六数之和.......这不就是又得重写一遍, 哈哈...
言归正传, 比如四数之和就是确定一个数字之后求三数之和 , 三数之和就是确立一个数字之和求两数之和....明显的递归啊, 那我写一个通用的函数, 直接改改入参丢上去两道题岂不是AC了?
毕竟就4 数之和, 递归栈不会破哈哈, 但是运行速度慢是真的.....
丢个运行速度图

Go
- // 该方法的意思是 是在nums数组中找amount 个和等于target 的结果
- func solveSum(nums []int, amount int, target int) [][]int {
-
- // 剩下的数都不够amount个了肯定凑不够啦
- if nil == nums || len(nums) < amount {
- return [][]int{}
- }
-
- if amount == 0 {
- return [][]int{}
- }
-
- // 在nums中找 1 个等于target的
- if amount == 1 {
- for _, v := range nums {
- if v == target {
- res := []int{v}
- finalRes := make([][]int, 0)
- finalRes = append(finalRes, res)
- return finalRes
- }
- }
- return [][]int{}
- }
-
- length := len(nums)
- res := make([][]int, 0)
- for i := 0; i <= length-amount; i++ {
- // 注意要去重
- if i-1 >= 0 && nums[i] == nums[i-1] {
- continue
- }
-
- // 问题就分解为 在剩下的数组中找 amount - 1 等于
- // target-nums[i]的值了
- tmp := solveSum(nums[i+1:], amount-1, target-nums[i])
-
- // 拼装返回结果
- for _, v := range tmp {
- now := make([]int, 0)
- now = append(now, nums[i])
- now = append(now, v...)
- res = append(res, now)
-
- }
-
- }
-
- return res
-
- }
-
- func fourSum(nums []int, target int) [][]int {
- if nil == nums || len(nums) < 4 {
- return [][]int{}
- }
-
- // 记得排序再调 solveSum函数
- sort.Ints(nums)
- // 求四数之和等于target的
- return solveSum(nums, 4, target)
- }
.