zoukankan      html  css  js  c++  java
  • [LeetCode] 39. Combination Sum(组合的和)

    Description

    Given an array of distinct integer candicates and a target integer target, return a list of all unique combination of candidates where chosen numbers sum to target. You may return the combinations in any order.
    给一个由互不相同的整数组成的数组 candidates 和一个整数 target返回一个列表,列表里包含所有互异组合,组合里的元素来自于 candidates,且这些元素的和等于 target。你可以以任何顺序返回答案。

    The same number may be chosen from candidates an unlimited number of times. Two combinations are unique if the frequency of at least one of the chosen numbers is different.
    相同的数可以使用若干次。对于两个组合,如果至少一个数出现的频率不同,则认定其为不同的组合

    It is guaranteed that the number of unique combinations that sum up to target is less than 150 combinations of the given input.
    输入保证满足条件的组合元素小于 150 个。

    Examples

    Example 1

    Input: candidates = [2,3,6,7], target = 7
    Output: [[2,2,3],[7]]
    Explanation:
    2 and 3 are candidates, and 2 + 2 + 3 = 7. Note that 2 can be used multiple times.
    7 is a candidate, and 7 = 7.
    These are the only two combinations.
    

    Example 2

    Input: candidates = [2,3,5], target = 8
    Output: [[2,2,2,2],[2,3,3],[3,5]]
    

    Example 3

    Input: candidates = [2], target = 1
    Output: []
    

    Example 4

    Input: candidates = [1], target = 1
    Output: [[1]]
    

    Example 5

    Input: candidates = [1], target = 2
    Output: [[1,1]]
    

    Constraints

    • 1 <= candidates.length <= 30

    • 1 <= candidates[i] <= 200

    • All elements of candidates are distinct

    • 1 <= target <= 500

    Solution

    这题暴力搜索是比较简单的,不过在暴力搜索前可以把 candidates 排下序,方便剪枝。代码如下:

    class Solution {
        private val result = hashSetOf<List<Int>>()
    
        fun combinationSum(candidates: IntArray, target: Int): List<List<Int>> {
            candidates.sort()
            backtrack(candidates, 0, target, arrayListOf())
            return result.toList()
        }
    
        private fun backtrack(candidates: IntArray, curIndex: Int, target: Int, combination: MutableList<Int>) {
            if (target < 0) {
                return
            }
            if (target == 0) {
                result.add(combination.sorted())
            }
            for (i in curIndex..candidates.lastIndex) {
                if (target >= candidates[i]) {
                    combination.add(candidates[i])
                    backtrack(candidates, curIndex, target - candidates[i], combination)
                    combination.removeAt(combination.lastIndex)
                }
            }
        }
    }
    
  • 相关阅读:
    shell中单引号、双引号、反斜杠简说
    shell脚本
    求素数
    SqlBulkCopy高效写入数据库Demo
    地图面面观之百望山
    FileUpload控件客户端验证
    如何将shapefile进行拆分
    Python 字符串操作
    如何重装oracle
    资料
  • 原文地址:https://www.cnblogs.com/zhongju/p/13924280.html
Copyright © 2011-2022 走看看