在数组中寻找对应和

Input:长度为n的数组作为查找对象,一个数字作为要查找的标准

Output:  挑选出数组中满足和为该数字的子数组

思路:

试想,若有一数组为[1, 2, 3, 4, 5, 6, 7, 8, 9]找到和为6的子数组。结果应该为[1,2,3], [1,5], [2,4], [6]。

当挑选出一个数字 i 后,继续查找的和是6 - i,数组去掉一个 i 元素。

同时,保持要查找的和不变,查找的子数组中不带有 i 元素的子数组

def find_numbers(desired_sum, list_of_nb):
    '''
    >>> find_numbers(6, [1,2,3,4,5,6])
    [[6], [4, 2], [5, 1], [3, 2, 1]]
    '''
    return _find_numbers(desired_sum, list_of_nb)

def _find_numbers(desired_sum, list_of_nb):
    if desired_sum < 0:
        return
    if not list_of_nb:
        if desired_sum == 0:
            return [[]]
        return
    L1 = _find_numbers(desired_sum, list_of_nb[1:])
    L2 = _find_numbers(desired_sum - list_of_nb[0], list_of_nb[1:])
    if not L2:
        return L1
    L2 = [R + [list_of_nb[0]] for R in L2]
    if L1:
        return L1 + L2
    else:
        return L2

具体代码如上

使用递归的思想,base case是当desired_sum小于0时,返回一个空值,因为这种情况是错误的

当列表为空时,说明已经查找到最后,在此时,如果要求的和也为0,说明查找结束,返回一个列表的列表

否则,说明查找失败,返回一个空值

L1和L2分别对应两种情况,也即是得到没有list_of_nb[0]的结果和有list_of_nb[0]的结果

如果L2为一个空值,说明没有这种结果,那么返回另一种情况

否则要加上当前减去的那个值

如果L1是空值,那么只有L2存在,返回L2

否则把L1的情况加入到L2中

猜你喜欢

转载自www.cnblogs.com/AcodingDg/p/9090252.html
今日推荐