LeetCode算法题之39. Combination Sum(medium)

题目描述:

Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

The same repeated number may be chosen from candidates unlimited number of times.

Note:

All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.

Example 1:

Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]

Example 2:

Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]

题目大意:

  • 给定一个数组,全部是正整数,作为候选者,再给定一个目标,找出候选者,就是那些数的组合,使之加起来等于目标数,每个数可用次数不限

解题思路:

  1. 首先打眼一看,这是一个数组间的组合,加和等于一个目标数的问题,不过就是每个数可以用多次,而且还有可能有多个数相加等于target
  2. 个人想法是,只要是加和等于一个数的问题,就可以用 target-数组中的数=n,这个公式作为突破口,这个n要么就直接存在数组中,要么就是数组中其他数的加和
  3. 所以只要将这个公式循环下去,并且在每一个数下面都要做,最后发现n=0时,那就是说明之前循环所经历的数,就是我们要找的
  4. 如果发现n<0,就说明这种组合在所给定的数组中不存在,不是我们要找的,如果n>0,那就继续做差下去,说明没找完
  5. 有了想法,如何用程序实现这个想法,也是一个挑战啊

少废话,上代码:

class Solution:
    def combinationSum(self, candidates, target):
        candidates.sort()#升序排列数组,方面后面的判定条件的执行,且如遇数组的问题,经验建议首先进行排序操作
        ans = []#设置答案列表

        #定义一个查找函数
        def find(n=target, lt=[]):#两个参数,一个是初始值,一个用来装答案的子集
            if n == 0:#遇到n等于0了,说明有数符合条件了,下面进行去重操作
                lt.sort()
                if lt not in ans:#不在里面,才算一个有效答案
                    ans.append(lt)
            else:#否则,要进行向下去找数
                for i in candidates:#遍历每一个数,将所有可能的数都找出来
                    if n < 0:#发现小于0,则数据不对,直接跳出循环
                        break
                    else:
                        find(n-i, lt+[i])#继续做差,直到等于0,才算一个有效答案
        find()

        return ans

运行时间和内存使用:

  • Runtime: 720 ms, faster than 5.03% of Python3 online submissions for Combination Sum.
  • Memory Usage: 14 MB, less than 6.06% of Python3 online submissions for Combination Sum.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值