''' 解题思路: 1、使用DFS+回溯求解组合问题,dfs(iStart,res),其中iStart为搜索起点,res保存搜索路径, 2、持续搜索约束条件为当前路径和 num[i]+s 小于等于80,达到目标值时保存搜索路径 3、先排序,组合搜索范围 for i in range(iStart,n),利用i>iStart and num[i]==num[i-1]条件,去除重复搜索(i-1的搜索结果,必然包含i的结果) 4、dfs(i+1,res+[num[i]]) ,采用 res+[num[i]] 传参数自动回溯 ''' # @param num int整型一维数组 # @param target int整型 # @return int整型二维数组 # class Solution: def combinationSum2(self , num , target ): # write code here n = len(num) num = sorted(num) #print(num) iStart = 0 res = [] out = [] def dfs(iStart,res): s = sum(res) # 路径和 if s>target: return if s==target: if res not in out: # 这里也可以去重 out.append(res) # 保存路径 return # 返回空回溯 for i in range(iStart,n): dfs(i+1,res+[num[i]]) # i+1,增加路径 dfs(iStart,res) #print(out) return out #Solution().combinationSum2([100,10,20,70,60,10,50],80) # [[10,10,60],[10,20,50],[10,70],[20,60]] ''' def dfs(iStart,res): s = sum(res) # 路径和 if s==target: if res not in out: # 这里也可以去重 out.append(res) # 保存路径 return # 返回空回溯 for i in range(iStart,n): if i>iStart and num[i]==num[i-1]: # 去除重复搜索(i-1的搜索结果,必然包含i的结果) continue if num[i]+s <= target: # 持续搜索约束条件为当前路径和 num[i]+s 小于等于80 dfs(i+1,res+[num[i]]) # i+1,增加路径 '''