[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)