[Leetcode]组合总和扩展-Python递归

[Leetcode]组合总和扩展

题目描述

假设"number"由不等于0的数字组成的数组,而sum_of_digits是一个严格的正整数。通过可能删除“number”中的一些数字,可以得到一个解决方案。(保持其余数字的顺序)使的和剩下的数字等于"sum_of_digits"。这些解决方案是从小到大列出的,没有重复。

说明

  • 所有数字(包括 sum_of_digitst)都是正整数。
  • 必须保持其余数字的顺序,使得剩下的数字等于"sum_of_digits"

示例如下:
>>> subnumbers_whose_digits_add_up_to(13, 2)
    []
>>> subnumbers_whose_digits_add_up_to(222, 2)
    [2]
>>> subnumbers_whose_digits_add_up_to(123, 6)
    [123]
>>> subnumbers_whose_digits_add_up_to(222, 4)
    [22]
>>> subnumbers_whose_digits_add_up_to(1234, 5)
    [14, 23]
>>> subnumbers_whose_digits_add_up_to(12341234, 4)
    [4, 13, 22, 31, 112, 121]
>>> subnumbers_whose_digits_add_up_to(121212, 5)
    [122, 212, 221, 1112, 1121, 1211]

解题思路

看题目,明白要枚举所有可能的情况,然后使用递归,最最重要的一点就是画出树状图,根据树状图敲代码就像依葫芦画瓢

  • 递归回溯
  • 递归终止条件:
    • 超出数组范围
    • 当前所选的结果和等于target,遍历整个数组
  • 递归调用:
    • 索引+1进行下一轮递归

源代码如下:

def subnumbers_whose_digits_add_up_to(number, sum_of_digits):
    results = set()
    number_list = str(number)
    compute(number_list,1,"",0,sum_of_digits,results)
    results = list(results)
    results.sort()
    print(results)

def compute(number_list,depth,str_l,sum_before,target,results):
    if sum_before == target:
        results.add(int(str_l))
        return
    elif sum_before >  target:
        return
    elif depth > len(number_list):
        return
    else:
        current_num = int(number_list[depth-1])
        compute(number_list, depth+1, str_l, sum_before, target,results)
        compute(number_list, depth+1, str_l+str(current_num),sum_before+current_num,target,results)


if __name__ == '__main__':
    subnumbers_whose_digits_add_up_to(12345, 5)
    subnumbers_whose_digits_add_up_to(121212, 5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值