题目:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle

题解:

这道题要求 求连续的数组值,加和最大。

试想一下,如果我们从头遍历这个数组。对于数组中的其中一个元素,它只有两个选择:

1. 要么加入之前的数组加和之中(跟别人一组)

2. 要么自己单立一个数组(自己单开一组)

所以对于这个元素应该如何选择,就看他能对哪个组的贡献大。如果跟别人一组,能让总加和变大,还是跟别人一组好了;如果自己起个头一组,自己的值比之前加和的值还要大,那么还是自己单开一组好了。

所以利用一个sum数组,记录每一轮sum的最大值,sum[i]表示当前这个元素是跟之前数组加和一组还是自己单立一组好,然后维护一个全局最大值即位答案。

代码如下;

 1     public int maxSubArray(int[] A) {
 2         int[] sum = new int[A.length];
 3         
 4         int max = A[0];
 5         sum[0] = A[0];
 6  
 7         for (int i = 1; i < A.length; i++) {
 8             sum[i] = Math.max(A[i], sum[i - 1] + A[i]);
 9             max = Math.max(max, sum[i]);
         }
  
         return max;
     }

同时发现,这道题是经典的问题,是1977布朗的一个教授提出来的。

http://en.wikipedia.org/wiki/Maximum_subarray_problem

并发现,这道题有两种经典解法,一个是:Kadane算法,算法复杂度O(n);另外一个是分治法:算法复杂度为O(nlogn)。

1. Kadane算法

代码如下:

 1     public int maxSubArray(int[] A) {
 2         int max_ending_here = 0;
 3         int max_so_far = Integer.MIN_VALUE;
 4         
 5         for(int i = 0; i < A.length; i++){  
 6             if(max_ending_here < 0) 
 7                  max_ending_here = 0;  
 8             max_ending_here += A[i];  
 9             max_so_far = Math.max(max_so_far, max_ending_here);   
         }  
         return max_so_far; 
     }

2. 分治法:

代码如下:

 1     public int maxSubArray(int[] A) {
 2          return divide(A, 0, A.length-1); 
 3     }
 4     
 5   public int divide(int A[], int low, int high){  
 6         if(low == high)
 7             return A[low];  
 8         if(low == high-1)  
 9             return Math.max(A[low]+A[high], Math.max(A[low], A[high]));
             
         int mid = (low+high)/2;  
         int lmax = divide(A, low, mid-1);  
         int rmax = divide(A, mid+1, high); 
         
         int mmax = A[mid];  
         int tmp = mmax;  
         for(int i = mid-1; i >=low; i--){  
             tmp += A[i];  
             if(tmp > mmax)
                 mmax = tmp;  
         }  
         tmp = mmax;  
         for(int i = mid+1; i <= high; i++){  
             tmp += A[i];  
             if(tmp > mmax)
                 mmax = tmp;  
         }  
         return Math.max(mmax, Math.max(lmax, rmax));  
           
     } 

Reference:

http://en.wikipedia.org/wiki/Maximum_subarray_problem

http://www.cnblogs.com/statical/articles/3054483.html

http://blog.csdn.net/xshengh/article/details/12708291

Maximum Subarray leetcode java的更多相关文章

  1. Maximum Subarray - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...

  2. Maximum Subarray——LeetCode

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  3. LeetCode 53. Maximum Subarray(最大的子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  4. LeetCode 53. 最大子序和(Maximum Subarray)

    53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...

  5. [Leetcode][Python]53: Maximum Subarray

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...

  6. 53. Maximum Subarray【leetcode】

    53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...

  7. [array] leetcode - 53. Maximum Subarray - Easy

    leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...

  8. LeetCode: Maximum Subarray 解题报告

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  9. 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略

    原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...

随机推荐

  1. 洛谷P3521 [POI2011]ROT-Tree Rotation [线段树合并]

    题目传送门 Tree Rotation 题目描述 Byteasar the gardener is growing a rare tree called Rotatus Informatikus. I ...

  2. Linux C函数库参考手册

    目录 第1章 字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ascii码字符) isblank(测试字符是否为空 ...

  3. TPS和QPS是什么,他们的区别是什么

    一.TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数.TPS包括一条消息入和一条消息出,加上一次用户数据库访问.(业务TPS = CAPS × ...

  4. 一个完成的spring xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. HDU 5694 BD String 迭代

    BD String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5694 Description Problem Description 众所周知, ...

  6. Codeforces Round #256 (Div. 2) C. Painting Fence

    C. Painting Fence Bizon the Champion isn't just attentive, he also is very hardworking. Bizon the Ch ...

  7. Codeforces Round #279 (Div. 2) C. Hacking Cypher 机智的前缀和处理

    #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...

  8. 读书笔记_Effective_C++_条款三十四:区分接口继承和实现继承

    这个条款书上内容说的篇幅比较多,但其实思想并不复杂.只要能理解三句话即可,第一句话是:纯虚函数只继承接口:第二句话是:虚函数既继承接口,也提供了一份默认实现:第三句话是:普通函数既继承接口,也强制继承 ...

  9. ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)

    catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...

  10. 设置Linux SSH登录后的欢迎信息

    在这几个文件,各自都设置一下: /etc/motd /etc/issue 在/etc/ssh/sshd_config添加“Banner /etc/ssh/ssh_login_banner” 内容: \ ...