码迷,mamicode.com
首页 > 编程语言 > 详细

[算法]滴滴笔试题——求最大子串和(O(n)复杂度)

时间:2017-08-26 21:27:26      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:style   blank   http   描述   htm   str   tar   idt   main   

扫描法。一次扫描数组即可得出答案,复杂度O(n)。这种方法用文字描述不容易说清楚,下面用每一步运算的图示来表达。伪代码如下:

 maxsofar=end=0;
 for i=[0,n)
     end=max(end+x[i],0)
     maxsofar=max(maxsofar,end)

技术分享

技术分享

即使后面没有这样的值了,maxsofar中还保存了原来的最大和,有恃无恐。这里的一条重要原则是目前end的值必须>0,如果<0,则不用考虑,立刻放弃end目前的值,将它置为0,并且把end的指针指向58。

以此类推下去,最后可得正确的结果。

整理之后的代码:

package com;

public class TestMax {
     public static void main(String[] args) {
         int[] a = new int[]{31, -41, 59, 26, -53, 58, 97, -93, -23, 84};
         int end = 0;
         int maxsofar = 0;
         for (int i = 0; i < a.length; i++) {
            end += a[i];
            if(end > 0){
                if(maxsofar < end){
                    maxsofar = end;
                }
            }else{
                end = 0;
            }
        }
        System.out.println(maxsofar);
     }
}

 

参考:http://blog.nlogn.cn/programming-pearls-the-maximum-sum-of-substring/

http://www.cnblogs.com/yuwenfeng/p/4121451.html

[算法]滴滴笔试题——求最大子串和(O(n)复杂度)

标签:style   blank   http   描述   htm   str   tar   idt   main   

原文地址:http://www.cnblogs.com/DarrenChan/p/7436355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!