求数组子序列的最大和

时间:2021-07-07 11:08:28

求数组子序列的最大和

一、问题描述

 

输入一个整形数组,数组里可以有正数或负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

 

       例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

 

第一次遇到这道题是参加x迅的笔试。题目中给出了两种解法,让填空。

 

二、简单解

 

拿到这道题,如果不考虑性能和复杂度,最简单的方法就是穷举。穷举出所有的子数组,并求出他们的和,返回最大值。不过,复杂度为O(n3),不符合题目的要求(复杂度On)

 

求数组子序列的最大和
int max_sum(int *arr, int len){  
    int max, sum;  
  
    for(int i = 0; i < len; i++) {  
        for(int j = i; j < len; j++) {  
            sum = 0;  
            for(int k = i; k <= j; k++) {  
                sum = sum + arr[k];  
                if(sum > max) {  
                    max = sum;  
                }  
            }  
        }  
    }  
  
    if(max == 0) {  
        return max(arr, len);  
    }  
    return max;  
}  
求数组子序列的最大和

 

 

 

三、复杂度为N2的解

 

 

 

观察上面的代码,我们使用了3个for循环。其中最内侧的for循环主要是控制每个字序列的长度,由于我们在计算的过程中,已经保存了当前最大字序列和,字序列的长度N对我们来说意义不大,因此完全可以撤消最内侧的循环。只按每个字序列起始位置来计算最大和。这样得到一个复杂度为N2的解。

 

求数组子序列的最大和
int max_sum2(int *arr, int len){  
    int sum, max = 0;  
  
    for(int i = 0; i < len; i++) {  
        sum = 0;  
        for(int j = i; j < len; j++) {  
            sum = sum + arr[j];  
            if(max < sum) {  
                max = sum;  
            }  
        }  
    }  
  
    if(max == 0) {  
        return max(arr, len);  
    }  
      
    return max;  
}  
求数组子序列的最大和

 

 

 

四、更低复杂度的探索

 

 

 

至此,我们已经得到一个复杂度为N 2的解法。那么有没有更低复杂度的算法呢?在N 2的算法中,我们遍历了从0到len-1开始的字序列,求出每种情况下得到的最大字序列和。那么我们有没有可能去掉这个循环呢?考虑使用 动态规划的思想,记max_sum[i]为从0到i的子序列的最大和,那么可以得到递推式:

 

 

 

if max_sum[i] > 0    
then    
       if arr[i+1] > 0    
       then max_sum[i+1] = max_sum[i] + arr[i+1];    
else    
       max_sum[i+1] = max(0, arr[i+1])   

利用这种思路得到一个线性时间的解答:

求数组子序列的最大和
int max_sum3(int *arr, int len) {  
    int sum, max;  
  
    max = sum = 0;  
    for(int i = 0; i < len; i++) {  
        sum += arr[i];  
        if(sum < 0) {  
            sum = 0;  
        }  
  
        if(sum > max){  
            max = sum;  
        }  
    }  
  
    if(max == 0) {  
        return max(arr, len);  
    }  
    return max;  
}  
求数组子序列的最大和

至此,我们得到一个时间复杂度On,空间复杂度O1的解。

 


2013-06-17  02:02:30

技术人员如何创业《四》- 打造超强执行力团队

      好的团队是创业公司成功的必要因素之一。差劲的团队会导致整个团队没有战斗力,互相算计,只看到自己的利益,永远做不成一个好的产品。优秀的团队整个团体非常有凝聚力,以公司的事业为自己的事业,各自发挥自己的特长并互相帮助对方,不计较个人短暂的得失努力把公司推向一个又一个高点。我想没有一个创业者不想建立这样的团队,但很多人想法是好的,为什么最终却达不到理想团队的效果呢?

      要知道人的问题永远是最复杂、最难处理的,因为人是可变化的实体,而作为技术创业者的我们对于电脑、程序处理的得心应手,但对于人来说就不是那么容易了。和团队、和客户等等相关处理,需要很好的情商,只要人对了,成功也就理所当然了。不过这里有很多问题,如何组建最开始的合伙人团队? 最开始没钱没资源怎么找到好的人才?人才找到了,怎么打造一个团结互助、士气高涨的团队?团队成员参差不齐,如何保证有潜力暂时能力不足的人才不掉队也不影响公司的产品研发?如何保证公司辛苦培养的人才不会流失?这么多问题怎么创业?是的,本身创业就是一个挑战自我的机会,就算很多产品刚开始只有一个人后续也会发展团队来完成产品的扩展,本篇文章主要讲的也是需要多人协助才能达到目标的创业方式。

     1、如何组建合伙人团队?参考前面  技术人员如何创业《二》- 合伙人的模式、 技术人员如何创业《三》- 合伙人的分工

  •  建立行政、产品、技术、销售互补型合伙人团队。
  • 合伙人团队难免会有意见冲突,有了冲突可以有很好的解决矛盾的机制,比如投票。
  •  要利益目标一致,公司重大事项透明化,减少猜忌和沟通误区。
  •  把合伙人当成创始人对待,建立起责任机制并发挥主人翁精神,把公司的事情当成自身必成的事业来对待。

     2、最开始没钱没资源怎么找到好的人才?

      这确实不好办,好的人才一般要求待遇也很高。那不是没钱的创业者就吸引不到优秀的创业人才了吗?其实看看我们成功的企业,比如腾讯、阿里巴巴等。马化腾他们一伙人在当时也不算特别出类拔萃,因为整个团队能力互补并且有很好的合作信任机制使他们走向成功。马云更不用说了,小学读了7年,高考考了三次,和他一起创业的十八罗汉大部分都是他的学生和以前创业公司的下属。看到这里也许大家就明白了,其实刚开始创业我们不需要特别出类拔尖的人才,只要这些人能够互补并且有好的潜力就可以了。当然如果有很强能力的人愿意放弃高工资收入浑浑噩噩的加入到创业公司并且愿意长久创业下去,那就说明踩了*运了,这类人也要看情况管理,管理不好就像没有紧箍咒的孙悟空。说了这么多,需要关注这几点:

  • 寻找有潜力,有创业欲望的人。没有钱首先打消要找很强的人的念头,但是要找有那种不甘于现状,想在这个社会有所作为的人。
  • 建立大公司不能具备的学习成长环境。现在在大公司都是一个萝卜一个坑,人才比较多,发展机会也不是那么多。这也是我们吸引人才的一个优势,大家来了创业型公司可以一边学习一边做,不会像大公司论资排辈,只要做得好看结果论功行赏。
  • 目标导向和阶段性奖励的措施。   这个要做好,得让大家感觉到公司在不断发展,虽然目前收入不比大公司强,但是我们在成长,未来超过设置更大的空间也是有希望的。
  • 工作的多样性。这个也是大公司不具备的,在大公司换一个岗位很难,在小公司就不存在,哪里需要就在哪里革命,当然这个也会考虑大家的兴趣。只要能够创造出价值就行,以前在大公司只能做某一方面的技术,在创业型公司不只接触的技术面很多,还可以学习销售、营销、客户管理、财务等方面的知识。
  • 逐步扩大公司品牌影响力、技术专业影响力。这些东西搞好了,很多优秀的人才就会被公司形象、专业技术产生兴趣继而加入公司。因为人是群居动物,别说生活圈,我们在社交网络上也是找到自己感兴趣的人交流。

     3、怎么打造一个团结互助、士气高涨的团队。

      刚开始创业合伙人团队打造好了还不够。因为事情一多了就需要扩展整个团队,不可能所有事情创始人都能够搞定,团队的战斗力直接影响了整个公司的战斗力。我觉得一个团队最基本的就是要互相信赖,不只是合伙人需要信赖,整体团队也需要。合伙人都不信任就别开公司了,团队不信任合作会举步维艰,推动不了任何事情。信任包括同事对同事、上级对下级、下级对上级,任何一个环节都很重要。作为*怎么处理?
  • 认真思考每个人的性格和能力并根据能力安排好他们的位置和作用。这个很重要,如果把一个只会纸上谈兵的人安排在重要岗位,这种人在领导面前谈的头头是道,但是做起事来却屡屡受挫。如果他们还带领团队,那底下的员工更加不服管理导致团队战斗力下降。所以需要根据不同人的能力、性格和他们的兴趣安排工作,比如唐僧和四个徒弟分工就很不错,唐僧是项目经理负责团队管理和指导方向,孙悟空能力最强也担当了打怪的第一人,猪八戒能力还可以并且还会活跃团队气氛,沙僧做一些脏活累活并且无怨无恨,白龙马作为座驾非常称职并在合适的时候也会露两手。
  • 奖惩措施要公开公平透明。公司不管有没有发展,都需要有一套公开透明的奖惩措施,保证大家不会觉得不平衡。所谓论功行赏也是这样,奖励是摆在这里的,谁的能力强就能够得到。谁影响了整体公司的利益,谁就应该收到惩罚。我相信只要是为了创业一起来的兄弟都愿意接受这样的条件,通过这样的机制把想创业的更好的聚集在一起,把不好的人排除掉。
  • 阶段目标和进度要明确,并且每个人都知道整体目标和进度。作为领导者一定要掌控整个公司和项目的状况,不只是自己需要知道,团队也需要知道。大家需要知道我们目前做的东西处于整个公司的哪个部分,在整个项目中的哪个位置,现在进度怎么样。有了这些,团队了解到公司的经营状况和项目状况,使大家感觉自己的工作就是自己的事业,努力工作实现公司和项目目标也是为了我们自己。阶段完成目标后需要小小庆祝一下,有一种成就感。
  • 充分信任每一个团队成员,对于合适的人和合适的任务充分授权。充分信任你找到的每一个员工,相信他们能在自己的岗位发挥自己的最大作用。对于合适的人还需要再指定岗位充分授权。如果领导自己不信任员工,不授权员工做事,自己什么都要管是非常累,技术型领导更加容易这样。与其去管理团队还不如多花时间写几个函数来的实际。授权就是教人做事的方法,充分信任他能做好,并且知道和鼓励他不要怕错。授权后并不是不管了,还需要去跟踪进度保证他们执行到位。
  • 建立积极正面、坚持、负责到底的文化态度。领导是一面镜子,在遇到困难时大家都不愿意上的时候,自己得顶上。在收获任何一项果实,都需要坚持努力。因为你是焦点,必须要身先力行冲到最前面,好比古时候打仗一样,将军始终都是出头兵,如果将军到了打仗时使劲逃那谁还愿意去冲锋陷阵。

     4、如何保证有潜力暂时能力不足的人才不掉队也不影响公司的产品研发。

      公司刚成立,不可能全部找到各方面能力很强的人,还需要补充一些目前能力不足但是很有潜力的员工。他们虽然短时间内承担不了太多的事情,未来肯定会发展起来的。但是又有个很矛盾的东西,小公司不可能花大量时间去培养一个员工,当然招进去也是希望他马上干活的这种。那怎么取舍呢?
  • 建立学习型的团队。活到老学到老,技术团队需要不断加强学习。新人不能直接投入工作所以需要先学习一段时间才能正式工作。前期的学习可以采取导师指导的过程,在普及好规范、制度等后就可以在项目中锻炼了。刚开始做事情时,可以把一些简单的分配给他们做。有了一定成就感和分析能力后,可以在导师的指导下参与稍微复杂点的项目。每一个项目都必须要把设计文档写出来,并且开发后的东西刚开始必须要审核,审核通过后才能发布。这样团队成员在这样的发展中逐步成长起来,也完成了公司的产品。不过作为导师和技术总监也需要给每一个新员工制定好学习方向和路线。
  • 良好的团队沟通氛围,能力高的员工不歧视低能力员工。团结互助,这是一个强调团体的时代。大数据大数据,就是一堆人在一起才叫大数据。当然对于团队也是这样,不管团队内部什么成员,只要完成了团体目标才是好的团队。很多时候我们创业公司一个项目里有三分之一的新人比例,但是并不是因为新人的原因我们就完不成团队目标。所以以团队利益为导向的团队,在实现了团队梦想的同时自己的梦想也达成了。

     5、如何保证公司辛苦培养的人才不会流失。

      辛辛苦苦招的人,工作年限满了就开始跑路,离开的原因很多,可能领导不好、可能对方工资高点,可能对方技术和团队比较好。有潜力的人刚过来是不在乎工资,随着工作经验增多加上猎头也多,他们可能就受不了诱惑或者其他原因就跑到其他公司了。那我们如何才能做到大家会陪伴公司生存的每一天,不死不放弃的心得呢?

  • 好的领导。说到做到要有诚信。做不到的就先别承诺,承诺的不管有什么原因一定要达到。这个要做好不然下属经常也会为了自己的事情找借口。作为领导不比每件事情小事都自己做,充分调动大家的能力才是他的能力。好的领导尽量不要摆着一副暴发户的样子,要足够平和,让大家觉得你是大家的朋友而不是老板,多去和大家沟通,这样才能很好的融入大家的工作中。好的领导要有一些阅历,在大家都没有办法的时候你能想到办法。这里要说一点,技术型领导很怕别人比他强了,其实领导不可能什么都会,比如马云,他技术什么都不会,但是他能领导几万人的企业,能管理很多能人并且为他卖命。这才是一个好领导应该具备的特质。领导不是和下属比技术、比能力,而是比谁在遇到困难问题时谁还能想到办法,领导能够把一群比自己强的人管理起来已经就是很了不起了。领导必须是一个大方,懂得吃小亏占大便宜的人,如果随时在处理事情都表现得很小气,员工也不会觉得跟着这个领导以后公司成功了自己能得到什么利益。
  • 好的文化。任何一个公司都必须要有好的文化。好的文化可以使大家凝聚在一起,朝着一个目标奋斗。比如腾讯的文化:  正直、尽责、合作、创新。阿里巴巴的文化是:客户第一、团队合作、拥抱变化、诚信、激情、敬业。他们都突出了尽职、合作等文化,正是这些文化使他们的员工觉得作为公司一员很骄傲,正是这样阿里巴巴和腾讯才有这么多的员工和好雇主称号。有了这样的团队,他们不成功也难。关心员工的生活(安排休息区,有条件的还可以准备一些水果,桌面乒乓之类)。
  • 好的制度。领导一句话容易变成皇帝一句话封建主义社会。没有了制度就像没有了军规,没有了法律,完全靠人的本能和行为约束是不现实的。有了好的制度,不管是领导还是员工都应该一视同仁保证规矩方圆得当。好的制度并不是领导一个人说了算,最好是这个制度是从现有团队从目前状况中抽离开来,团队中成员一致认同或者选票得出。得到大家支持的制度才是好的制度。比如可以建立灵活的考勤制度,合理的奖惩制度,透明的成长职业规划和发展机制等。
  • 好的职业规划。其实并等于创业没有成功就不需要给大家做职业规划了,反而在创业的时候更应该做。毕竟大部分员工进来不像创始人对自己做的事情这么了解,也不一定有那么多的激情,他们可能更多的考虑个人和自身的发展,当然如果能够搭上一艘创业的好船,公司成功了他们也成功了当然非常好,我想这也是他们愿意来创业公司的一方面原因。我觉得作为公司的领导需要给每一个加入的人规划好未来,将来如何发展,对大家负责。因为这伙兄弟为了这个共同的梦想跟着当前的带头人放弃安逸的生活一起奋斗是多么的不容易啊。说到底,就算创业失败了,大家也是在创业的过程中学习到了非常多的经验和知识。
      说到底,每个公司创业的方式可能会有些不同,大家根据情况参考一下。后续再说一下,小型创业公司实施敏捷开发实战。

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 技术人员如何创业《四》- 打造超强执行力团队

 
 
分类:  创业管理
标签:  创业合伙人技术人员执行力

题记:贬值的价值:

也许大学生在这个社会,已经太多,太多,多到什么程度?

举个例子:

上月去校门外一家快餐店吃饭,门口贴的招牌:

本店因业务需要招洗碗工一名,限本科文凭以上。。。

现在后悔当时没有拿手机照下来。

我不是技术牛人,该文章也不是技术文档,仅仅作为一种感叹,一种抱怨。

我也仅仅是大3转眼大4的2本学生。

 

孤独的回望:

3年,回首3年,3年的代码时间,抠心自问:3年的时间,自己手动一个字母一个字母输入的代码:

50W行+

3年,3年用坏了4个外接键盘(笔记本),全部是按键按下去起不来就失灵了。

这一切都是因为,我相信付出总有回报。

 

痛苦的生涯:

我从没因为自己是一个大学生而觉得有多了不起,相反这样更加增加了我的顾虑。

我不是那种富家子弟,我更加的懂得生命的价值,明白时间的意义。

因为用12个小时从5楼的废墟中刨的血肉模糊爬出来的经历不是随便能忘记。。。(512---北川中学)

17岁家破人亡的感觉不是时常都能遇见。

 

大2这一年,是最累的一年,这一年,接触java/数据库/数据结构。

学校的宿舍一直是晚上11.30断电,学校的教室允许通宵,于是整整一年,几乎都是白天上课,晚上抱着电脑蹲在教室一直到天亮然后直接去上课。

几乎每天睡觉时间只有3小时,中午没有午睡,这一年,翻遍了图书馆和java挂钩的书,书中的代码一一写出。

看着OCP教程,将所有语句在Oracle数据库中跑了一次。

我总喜欢把学习说成研究,因为我认为没有人教我,就是研究。

看了不下4遍的书,将其下载下来以便随时翻阅:

 

求数组子序列的最大和

求数组子序列的最大和

 

在这一年,做过的东西(2年前的东西:)

1)有仿QQ在线斗地主:

求数组子序列的最大和

 

2)在线下象棋:

 

求数组子序列的最大和

求数组子序列的最大和

 

3)自己写的Tomcat,能实现基本的项目部署:

 

求数组子序列的最大和

 

4)java浏览器:

5)单机五子棋(算法很累):

6)C/S注册表管理系统

等等还有很多小玩意儿。

 

没有明天的明天:

 

转眼大3了,在大2末期也走向了j2ee,没想到这是这样的一条不归路。

大3这一年,和大2一样,睡觉也是很少,不过有了一个好处,那就是大2的时候寝室楼的大门是用铁链锁住的,半夜不能回寝室,大3的时候改造了,刷卡,意味着随时都能回寝室,只要刷卡。

所以晚上去教室,凌晨5点再回来躺一会儿。

这一年,做的最多的项目就是Web,多到已经不想用数量来形容。

其中最有价值的项目是ZF部门的一个项目,使用ejb+SebService,涉及到银行接口,例如转账。

最大金钱的项目是一个4W的项目,在线考试系统。

对于这些技术轻量级也好,重量级也好,不想做太多评价。

 

这不是结束:

走在顶层,也许这也就是一个错误,曾经做个过单片机,后来自己学过80x86,用实验箱做过ALU运算器以及存储器,计算机硬件也算入门,当时老师建议我走底层,说底层很丰富,现在想想,也许是对的。

纵观整个IT行业,人员过于饱和,其中原因很多,特别是web,上手容易,很多培训机构培训半个月学员就上岗,培训结构接着培训下一班。

面试过,很顺利,被pass,没条件。

通过各种渠道,知道我能做的事,一个培训半个月的培训机构的人也能做,并且使用他付出的价值比我还低。

我知道,今年的就业率是28.3%。。。

已经很高了。

献给众多正准备走向web的朋友,这条路,是一条不归路。。。

 
 
分类:  情感世界