leetcode18. 四数之和(如何一次解决)

题目链接

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

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值