在数组中寻找对应和

Posted AcodingDog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数组中寻找对应和相关的知识,希望对你有一定的参考价值。

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中

以上是关于在数组中寻找对应和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第三十四题-寻找数组中对应目标值的首尾索引

LeetCode第三十五题-寻找数组中对应目标值的首尾索引

如何在 MS Word 文档中显示代码片段,因为它在 *** 中显示(滚动条和灰色背景)

Chrome-Devtools代码片段中的多个JS库

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

如何测量代码片段的调用次数和经过时间