leetcode 39.组数总和 (python)回溯法

北城以北 提交于 2020-02-24 13:37:40

题目:
在这里插入图片描述
题解:
从题目可以看出是找所有组合的问题,因此就想起用递归,回溯的方法来求解。
我们首先对数组进行排序,这样方便查找。
代码思路:
进行回溯的过程中,我们通过更新target来寻找合适的组合。
即我们每次选取一个元素,就从target中减去这个元素,然后利用减去后的差来更新target。
在进行回溯的过程中,我们需要确定回溯的数组范围,因此我们引入索引index,因为可以重复选择,所以index值等于当前的索引i。
图解思路:
在这里插入图片描述

代码:

class Solution:
    def combinationSum(self, candidates, target):
        index = 0
        result = []
        temp = []
        de = target
        candidates.sort()


        def dfs(target,index,temp):
            # print('de: %d' % de)
            # print('sum: %d' % sum(temp))

            if sum(temp) == de:
                result.append(temp)

                # print(result)

                # temp = []


            for i in range(index,len(candidates)):
                # print('i: %d' % i)


                if target > candidates[i]:
                    # temp.append(candidates[i])

                    # print("######")
                    # print('i: %d' % i)
                    # print('temp:',temp)
                    dfs(target - candidates[i],i,temp + [candidates[i]])


                elif target == candidates[i]:

                    # print("444444")

                    # temp.append(candidates[i])#这个时候不能再往后进行遍历了,因为后面的数都大于target,

                    dfs(target - candidates[i],i,temp + [candidates[i]])



                elif target < candidates[i]:#如果小于,本次递归结束,就回溯到上一次,继续遍历
                    # print("******")
                    # dfs(target + candidates[i],i + 1, temp)
                    break



        dfs(target,index,temp)
        # print(result)

        return result
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!