给你一个由 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)
}
.