• 算法----组合总和(Kotlin)-面试真题


    题目

    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

    candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

    对于给定的输入,保证和为 target 的不同组合数少于 150 个。

    示例 1:

    输入:candidates = [2,3,6,7], target = 7
    输出:[[2,2,3],[7]]
    解释:
    2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
    7 也是一个候选, 7 = 7 。
    仅有这两种组合。
    示例 2:

    输入: candidates = [2,3,5], target = 8
    输出: [[2,2,2,2],[2,3,3],[3,5]]
    示例 3:

    输入: candidates = [2], target = 1
    输出: []

    提示:

    1 <= candidates.length <= 30
    1 <= candidates[i] <= 200
    candidate 中的每个元素都 互不相同
    1 <= target <= 500

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/combination-sum
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解决思路

    1.典型的树形路径搜索
    2.保存路径的时候,重新创建一个副本就可以(element.addAll(path))
    3.这个dfs写不出来确实面试不好过

    解决方法

        fun combinationSum(candidates: IntArray, target: Int): List<List<Int>> {
            val results = mutableListOf<List<Int>>()
            dfs(candidates, target, mutableListOf(), 0, results)
            return results
        }
    
        private fun dfs(
            candidates: IntArray,
            target: Int,
            path: MutableList<Int>,
            startIndex: Int,
            result: MutableList<List<Int>>
        ) {
            if (target == 0) {
                val element = mutableListOf<Int>()
                element.addAll(path)
                result.add(element)
            } else if (target < 0) {
                return
            }
            for (i in startIndex until candidates.size) {
                path.add(candidates[i])
                dfs(candidates, target - candidates[i], path, i, result)
                path.removeAt(path.size - 1)
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    总结

    1.每天写算法的意义是
    会让你追求代码的质量
    追求时间和空间复杂度
    愿意打磨自己的编码质量

    2.最后保存一下可行的路径即可
    这种题 还是要画树图才好解决

    3.面试失败 准备的还是不够
    对于dfs还是不熟悉 一个迭代竟然没有写出来
    没想到啊

  • 相关阅读:
    多端开发之uniapp开发app
    Oracle EBS Interface/API(45)- 销售发运自动创建交货单
    布隆过滤器
    MySQL 8.0 OCP 1Z0-908认证考试题库(7-20)
    33.反射
    <学习笔记>从零开始自学Python-之-web应用框架Django( 十一)用户系统和身份验证
    6.S081 附加Lab3 线程切换——源代码实现(trap,yeild,context,Scheduler)
    空杯心态。
    XS-Leaks(跨站点泄漏)攻击和预防
    使用 AHK 在 VS Code 中根据上下文自动切换输入法状态
  • 原文地址:https://blog.csdn.net/u013270444/article/details/126724949