Combination Sum II

文章讲述了如何使用回溯算法解决给定候选数组中找到所有独特组合,使这些组合的数值之和等于目标值的问题。通过排序、回溯函数和空间复杂度分析,提供了一个有效的解决方案。

Problem

Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target.

Each number in candidates may only be used once in the combination.

Note: The solution set must not contain duplicate combinations.

Example 1:

Input: candidates = [10,1,2,7,6,1,5], target = 8
Output: 
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

Example 2:

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

Intuition

The problem involves finding all unique combinations in the given array candidates where the candidate numbers sum to the target. Each number in candidates may only be used once in the combination, and the solution set must not contain duplicate combinations. This problem can be solved using a backtracking approach.

Approach

Sort the Candidates:

Sort the array candidates to ensure that duplicates are adjacent and can be easily skipped during the backtracking process.
Initialize Result List:

Create an empty list res to store the resulting combinations.
Backtracking Function:

Implement a backtracking function (backtrack) that takes three parameters: the current combination cur, the current position pos, and the remaining target target.
In the base case:
If target is equal to 0, add a copy of the current combination to the result res.
If target is less than or equal to 0, return.
Use a loop to iterate through the candidates starting from the current position pos.
Skip duplicates by comparing the current candidate with the previous one.
Include the current candidate in the current combination and recursively call the backtrack function with the updated parameters.
Backtrack by removing the last element from the current combination.
Call Backtrack:

Call the backtrack function with initial values: an empty list for the current combination, starting position 0, and the target value.
Return Result:

Return the final result res.

Complexity

  • Time complexity:

The time complexity is O(2^n), where n is the length of the array candidates. This is because each element has two choices (include or exclude) for each recursive call, leading to 2^n possible combinations.

  • Space complexity:

The space complexity is O(n) due to the recursion stack. Additionally, the space required for the cur list contributes to the space complexity. The result res contains combinations, each with an average length of n/2, resulting in a space complexity of O(n * 2^n).

Code

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates = sorted(candidates)
        res = []
 
        def backtrack(cur, pos, target):
            if target == 0:
                res.append(cur.copy())
                return
            elif target <= 0:
                return
 
            prev = -1
            for i in range(pos, len(candidates)):
                if candidates[i] == prev:
                    continue
                cur.append(candidates[i])
                backtrack(cur, i + 1, target - candidates[i])
                cur.pop()
                prev = candidates[i]
            
        backtrack([], 0, target)
        return res
在调用 `Solution` 类的 `combinationSum2` 方法时出现 `AttributeError: 'Solution' object has no attribute 'combinationSum2'` 错误,通常表示该类中并未定义 `combinationSum2` 方法。此类错误可能由以下几个原因导致: - **拼写错误**:方法名可能存在拼写错误,例如大小写不一致或多余的字符。Python 是大小写敏感的语言,因此 `combinationSum2` 和 `combinationsum2` 会被视为不同的标识符。 - **方法未定义**:如果 `combinationSum2` 方法未在 `Solution` 类中定义,则尝试调用时会引发 `AttributeError`。确保该方法已在类中正确定义。 - **继承问题**:如果 `Solution` 类继承自另一个包含 `combinationSum2` 方法的类,但未正确继承或覆盖该方法,也可能导致此错误。 - **IDE 或编辑器缓存问题**:有时,开发环境可能未及时更新代码更改,导致调用旧版本的类定义。尝试重启 IDE 或清除缓存后重新运行代码。 以下是一个示例,展示如何正确定义 `combinationSum2` 方法: ```python class Solution: def combinationSum2(self, candidates, target): # 方法实现 pass ``` 如果用户确实意图调用 `combinationSum` 方法而非 `combinationSum2`,则应检查调用语句是否正确,并确认方法名拼写一致。此外,可以使用 `dir(Solution)` 函数查看 `Solution` 类中所有可用的方法和属性,以确认 `combinationSum2` 是否存在。 ### 示例:检查类的方法 ```python print(dir(Solution)) # 列出 Solution 类的所有属性和方法 ``` 通过上述方式,可以有效诊断并修复 `AttributeError: 'Solution' object has no attribute 'combinationSum2'` 错误。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值