美文网首页
2020-04-22

2020-04-22

作者: 木马音响积木 | 来源:发表于2020-04-22 23:42 被阅读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
    

    相关文章

      网友评论

          本文标题:2020-04-22

          本文链接:https://www.haomeiwen.com/subject/wllbihtx.html