2020-04-22

2020-04-22  本文已影响0人  木马音响积木

针对39题,想起来,爬楼梯问题,分硬币问题。
想到了用 dfs 递归来解决。
1、针对不允许重复,想到了单调栈,这里也就是list
2、针对candidates ,进行排序,可以在循环时,break,加速
3、注意,剪枝。通过单调栈,进行剪枝。
4、注意,列表的引用传递。
5、硬币本身可以重复多次,但要的是组合,不是排序。

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        ans=[]
        c=candidates
        c.sort()
        def dfs(n,st):
            if n<0:return
            if n==0:
                ans.append(st)
                return

            #this level
            for i in c:
                if i>n:break
                if n >= i and (not st or i >= st[-1]): #用单调栈,sort 非必要。
                    dfs(n-i,st+[i])

        dfs(target,[])
        return ans
class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        ans=[]
        c=candidates
        def dfs(n,st):
            if n<0:return
            if n==0:
                ans.append(st);return

            #this level
            for i in c:
                if n >= i and (not st or i >= st[-1]):
                    st.append(i)
                    dfs(n-i,st[:])  #这种写法能看出 回溯的影子。
                    st.pop()   #the most useful point
        dfs(target,[])
        return ans
上一篇下一篇

猜你喜欢

热点阅读