一文弄懂数组的和

方法一:双指针法,先要对数组进行排序

a=[12,6,8,1,4,3]
def sum2(a,target):
    res=[]
    a=sorted(a)
    l,r=0,len(a)-1
    while l<r:
        tmp=[0,0]
        if a[l]+a[r]==target:
            tmp[0]=a[l]
            tmp[1]=a[r]
            res.append(tmp)
            l+=1
            r-=1
        elif a[l]+a[r]>target:
            r-=1
        else:
            l+=1
    return res
print(sum2(a,9))

输出:[[1, 8], [3, 6]]

方法二:对于第一种方法,主要时间都用在进行排序上,我们可以利用hash来避免进行排序。

def sum2(a,target):
    dic={}
    res=[]
    for i in range(len(a)):
        tmp=[0,0]
        m=a[i]
        if target-m in dic:
            tmp[0]=m
            tmp[1]=target-m
            res.append(tmp)
        dic[m]=i
    return res
print(sum2(a,10))

输出:[[1, 8], [3, 6]]

方法三:免去建立hash表

def sum2(a,target):
    res=[]
    for i in range(len(a)):
        tmp=[0,0]
        if  target-a[i] in a[i+1:]:
            tmp[0]=a[i]
            tmp[1]=target-a[i]
            res.append(tmp)
    return res
print(sum2(a,9))

输出:[[6, 3], [8, 1]]

扩展:方法三可以扩展到三个数的和、四个数的和等;

def sum3(a,target):
    res=[]
    for i in range(len(a)):
        for j in range(i+1,len(a)):
            tmp=[0,0,0]
            if target-a[i]-a[j] in a[j+1:]:
                tmp[0]=a[i]
                tmp[1]=a[j]
                tmp[2]=target-a[i]-a[j]
                res.append(tmp)
    return res
print(sum3(a,13))

输出:[[6, 4, 3], [8, 1, 4]]

def sum4(a,target):
    res=[]
    for i in range(len(a)):
        for j in range(i+1,len(a)):
            for k in range(j+1,len(a)):
                tmp=[0,0,0,0]
                if target-a[i]-a[j]-a[k] in a[k+1:]:
                    tmp[0]=a[i]
                    tmp[1]=a[j]
                    tmp[2]=a[k]
                    tmp[3]=target-a[i]-a[j]-a[k]
                    res.append(tmp)
    return res
print(sum4(a,24))

输出:[[12, 8, 1, 3]]

扩展:数组中的和为n,但不限个数,同时也不能重复

a=[12,6,8,1,4,3]
res=[]
def nor_sum(a,target,pos,end,tmp):
    global res
    if target<0:
        return
    if target==0:
        res.append(tmp[:])
    for i in range(pos,end):
        tmp.append(a[i])
        nor_sum(a,target-a[i],i+1,end,tmp)
        tmp.pop()
nor_sum(a,12,0,len(a),[])
print(res)

输出:[[12], [8, 1, 3], [8, 4]]

可以重复:(主要的区别如红色所标注的)

a=[12,6,8,4,3]
res=[]
def nor_sum(a,target,pos,end,tmp):
    global res
    if target<0:
        return
    if target==0:
        res.append(tmp[:])
    for i in range(pos,end):
        tmp.append(a[i])
        nor_sum(a,target-a[i],i,end,tmp)
        tmp.pop()
nor_sum(a,12,0,len(a),[])
print(res)

输出:[[12], [6, 6], [6, 3, 3], [8, 4], [4, 4, 4], [3, 3, 3, 3]]

原文地址:https://www.cnblogs.com/xiximayou/p/11622102.html

时间: 2024-10-09 19:34:23

一文弄懂数组的和的相关文章

【TensorFlow】一文弄懂CNN中的padding参数

在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和池化操作,而这两种函数中都存在参数padding,该参数的设置很容易引起错误,所以在此总结下. 1.为什么要使用padding 在弄懂padding规则前得先了解拥有padding参数的函数,在TensorFlow中,主要使用tf.nn.conv2d()进行(二维数据)卷积操作,tf.nn.max_

一文弄懂计数排序算法!

这是小川的第385次更新,第413篇原创 01 计数排序算法概念 计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N). 02 基础版算法步骤 第一步:找出原数组中元素值最大的,记为max. 第二步:创建一个新数组count,其长度是max加1,其元素默认值都为0. 第三步:遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值. 第四步:创建结果数组result,起

一文弄懂神经网络中的反向传播法——BackPropagation

最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进行补充,但是补充的又是错的,难怪觉得有问题.反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用.如果不想看公式,可以直接把数值带进去,实际的计算一下,体会一下这个过程之后再来推导公式,这样就会觉得很容

【转】彻底弄懂最短路径问题(图论)

来源:彻底弄懂最短路径问题 http://www.cnblogs.com/hxsyl/p/3270401.html P.S.根据个人需要,我删改了不少 问题引入 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法,另外还有著名的启发式搜索算法A*,不过A*准备单独出一篇,其中Floyd算法可以求解任意两点间的最短路径的长度.笔者认为任意一个最

必须弄懂的495个C语言问题

必须弄懂的495个C语言问题 1.1 我如何决定使用那种整数类型? 如果需要大数 值(大于32, 767 或小于?32, 767), 使用long 型.否则, 如果空间很重要(如有大数组或很多结构), 使用short 型.除此之外, 就使用int 型.如果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字节时避免符号扩展的问题, 请使用对应的无符号类型.但是, 要注意在表达式中混用有符号和无符号值的情况. 尽管字符类型(尤其是无符号字符型) 可以当成"小" 整型使用

一文读懂UGC:互联网上的生态秘密

转载自近乎: UGC(User- Generated Content)用户原创生产内容,它是相对于PGC(Professionally-produced Content)专业生产内容的一种内容来源,简单来说,由专业个人.团队针对性输出的较为权威的内容都属于PGC,例如电视节目.报纸刊物.媒体资讯 等,而你朋友圈的图文.微博.知乎的文章.唱吧音乐.秒拍的各*,大都属于UGC. UGC产品(平台)即是以普通用户自发生产内容为基础,并由此引发的人与价值内容的关联.人与人的关联.人与商业的关联,最终为U

如何继承Date对象?由一道题彻底弄懂JS继承。

前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------长文+多图预警,需要花费一定时间---------- 故事是从一次实际需求中开始的... 某天,某人向我寻求了一次帮助,要协助写一个日期工具类,要求: 此类继承自Date,拥有Date的所有属性和对象 此类可以自由拓展方法 形象点描述,就是要求可以这样: // 假设最终的类是 MyDate,有一个getTest拓展方法 let date = new MyDate(); // 调用Date的方法,输出GM

一文读懂阻塞、非阻塞、同步、异步IO

原文:一文读懂阻塞.非阻塞.同步.异步IO 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以及使用方式.Unix网络编程一书中作者给出了五种IO模型:1.BlockingIO - 阻塞IO2.NoneBlockingIO - 非阻塞IO3.IO multiplexing - IO多路复用4.signal driven IO - 信号驱动IO5.a

摘录和再编:彻底弄懂JS执行机制

网文: https://juejin.im/post/59e85eebf265da430d571f89 并发模型和事件循环:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop Node.js事件循环,Timers, process.nextTick() javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascript版的