题目:

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. 20172301 《Java软件结构与数据结构》实验一报告

    20172301 <Java软件结构与数据结构>实验一报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  2. 俄罗斯方块 Tetris

    今天,为大家带来一个用Qt C++ (Windows环境下)做的一个简易俄罗斯方块小游戏 思路和模块介绍都在注释里面,其次就是一些项目中遇到的问题以及解决方案,在后面部分说明. 一.效果 测试图样 Q ...

  3. 历史文章分类汇总-Anaconda安装第三方包(whl文件)

    本文主要是对公众号之前发布的文章进行分类整理,方面大家查阅,以后会不定期对文章汇总进行更新与发布.   一.推荐阅读: Anaconda安装第三方包(whl文件) 福布斯系列之数据分析思路篇 福布斯系 ...

  4. 2018用IDEA搭建SSM框架(Spring+SpringMVC+Mybatis)

    使用IDEA搭建ssm框架 环境 工具:IDEA 2018.1 jdk版本:jdk1.8.0_171 Maven版本:apache-maven-3.5.3 Tomcat版本:apache-tomcat ...

  5. C++下的强制转换类型

    一.static_cast static_cast,静态类型转换.   下面,我举几个例子,大家就能清楚了. int main(int argc, char const *argv[]) { char ...

  6. 【WIN10】我的第一個WIN10-UWP應用——古文觀止

    已上架,下載地址:https://www.microsoft.com/store/apps/9nblggh6cc32 特點是:繁體豎排,隱藏/顯示標點符號. 截幾張圖來瞅瞅. 1.主界面 這張圖使用的 ...

  7. 6.13校内互测 (DP 带权二分 斜率优化)

    丘中有麻plant 改自这儿,by ZBQ. 还有隐藏的一页不放了.. 直接走下去的话,如果开始时间确定那么到每个点的时间确定,把time减去dis就可以去掉路程的影响了. 这样对于减去d后的t,如果 ...

  8. 502 解决:[WARNING] fpm_children_bury

    查过网上的资源,基本都是认为是php线程打开文件句柄受限导致的错误.具体的解决的办法如下:   1.提升服务器的文件句柄打开打开 /etc/security/limits.conf : (增加) * ...

  9. [BJOI2010]次小生成树

    OJ题号: BZOJ1977.COGS2453 题目大意: 给你一个无向连通图,求严格次小生成树. 思路: 对于一般次小生成树,我们有一个结论:一般次小生成树一定可以通过替换掉最小生成树某一条边得到. ...

  10. BZOJ3522&4543 [POI2014]Hotel加强版 长链剖分

    上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点 ...