• 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

    1. // 该方法的意思是 是在nums数组中找amount 个和等于target 的结果
    2. func solveSum(nums []int, amount int, target int) [][]int {
    3. // 剩下的数都不够amount个了肯定凑不够啦
    4. if nil == nums || len(nums) < amount {
    5. return [][]int{}
    6. }
    7. if amount == 0 {
    8. return [][]int{}
    9. }
    10. // 在nums中找 1 个等于target的
    11. if amount == 1 {
    12. for _, v := range nums {
    13. if v == target {
    14. res := []int{v}
    15. finalRes := make([][]int, 0)
    16. finalRes = append(finalRes, res)
    17. return finalRes
    18. }
    19. }
    20. return [][]int{}
    21. }
    22. length := len(nums)
    23. res := make([][]int, 0)
    24. for i := 0; i <= length-amount; i++ {
    25. // 注意要去重
    26. if i-1 >= 0 && nums[i] == nums[i-1] {
    27. continue
    28. }
    29. // 问题就分解为 在剩下的数组中找 amount - 1 等于
    30. // target-nums[i]的值了
    31. tmp := solveSum(nums[i+1:], amount-1, target-nums[i])
    32. // 拼装返回结果
    33. for _, v := range tmp {
    34. now := make([]int, 0)
    35. now = append(now, nums[i])
    36. now = append(now, v...)
    37. res = append(res, now)
    38. }
    39. }
    40. return res
    41. }
    42. func fourSum(nums []int, target int) [][]int {
    43. if nil == nums || len(nums) < 4 {
    44. return [][]int{}
    45. }
    46. // 记得排序再调 solveSum函数
    47. sort.Ints(nums)
    48. // 求四数之和等于target的
    49. return solveSum(nums, 4, target)
    50. }

    .

  • 相关阅读:
    单片非晶磁性测量系统磁参量指标
    计算机毕设推荐基于微信小程序的自来水收费系统
    一场江湖恩怨从「聚合数据」说起——第五篇
    Java的基础语法(二)
    Java一键授权方案 离线授权 日期授权 代码授权 代码混淆
    构造器(constructor)是否可被重写(override)?
    手机App防沉迷系统C卷(Java&&Python&&C++&&Node.js&&C语言)
    互联网跟帖评论有新规,内容审核平台也要加强防范
    Springboot 加密方案探讨
    项目适配 Oracle 改造的几点启示
  • 原文地址:https://blog.csdn.net/qq_40722582/article/details/126207579