Maximum Subarray解题报告zz
http://fisherlei.blogspot.com/2012/12/leetcode-maximum-subarray.html
[−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray
[4,−1,2,1] has the largest sum = 6.[解题思路]
O(n)就是一维DP.
假设A(0, i)区间存在k,使得[k, i]区间是以i结尾区间的最大值, 定义为Max[i], 在这里,当求取Max[i+1]时,
Max[i+1] = Max[i] + A[i+1],  if (Max[i] + A[i+1] >0)
                = 0, if(Max[i]+A[i+1] <0),如果和小于零,A[i+1]必为负数,没必要保留,舍弃掉
然后从左往右扫描,求取Max数字的最大值即为所求。
[Code]
1:    int maxSubArray(int A[], int n) {
2:      // Start typing your C/C++ solution below
3:      // DO NOT write int main() function
4:      int sum = 0;
5:      int max = INT_MIN;
6:      for(int i =0; i < n ; i ++)
7:      {
8:        sum +=A[i];
9:        if(sum>max)
10:          max = sum;
11:        if(sum < 0)
12:          sum = 0;
13:      }
14:      return max;
15:    }
但是题目中要求,不要用这个O(n)解法,而是采用Divide & Conquer。这就暗示了,解法必然是二分。分析如下:
假设数组A[left, right]存在最大值区间[i, j](i>=left & j<=right),以mid = (left + right)/2 分界,无非以下三种情况:
subarray A[i,..j] is
(1) Entirely in A[low,mid-1]
(2) Entirely in A[mid+1,high]
(3) Across mid
对于(1) and (2),直接递归求解即可,对于(3),则需要以min为中心,向左及向右扫描求最大值,意味着在A[left, Mid]区间中找出A[i..mid], 而在A[mid+1, right]中找出A[mid+1..j],两者加和即为(3)的解。
1:    int maxSubArray(int A[], int n) {
2:      // Start typing your C/C++ solution below
3:      // DO NOT write int main() function
4:      int maxV = INT_MIN;
5:      return maxArray(A, 0, n-1, maxV);
6:    }
7:    int maxArray(int A[], int left, int right, int& maxV)
8:    {
9:      if(left>right)
10:        return INT_MIN;
11:      int mid = (left+right)/2;
12:      int lmax = maxArray(A, left, mid -1, maxV);
13:      int rmax = maxArray(A, mid + 1, right, maxV);
14:      maxV = max(maxV, lmax);
15:      maxV = max(maxV, rmax);
16:      int sum = 0, mlmax = 0;
17:      for(int i= mid -1; i>=left; i--)
18:      {
19:        sum += A[i];
20:        if(sum > mlmax)
21:          mlmax = sum;
22:      }
23:      sum = 0; int mrmax = 0;
24:      for(int i = mid +1; i<=right; i++)
25:      {
26:        sum += A[i];
27:        if(sum > mrmax)
28:          mrmax = sum;
29:      }
30:      maxV = max(maxV, mlmax + mrmax + A[mid]);
31:      return maxV;
32:    }
考虑到最大和仍然可能是负数,所以对于有些变量的初始化不能为0,要为INT_MIN。
Maximum Subarray解题报告zz的更多相关文章
- LeetCode: Maximum Subarray 解题报告
		
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
 - 【LeetCode】718. Maximum Length of Repeated Subarray 解题报告(Python)
		
[LeetCode]718. Maximum Length of Repeated Subarray 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxu ...
 - 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
 - LeetCode Maximum Product Subarray 解题报告
		
LeetCode 新题又更新了.求:最大子数组乘积. https://oj.leetcode.com/problems/maximum-product-subarray/ 题目分析:求一个数组,连续子 ...
 - 【LeetCode】978. Longest Turbulent Subarray 解题报告(C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 虫取法 日期 题目地址:https://leetco ...
 - [LeetCode] 53. Maximum Subarray 解题思路
		
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
 - 【LeetCode】414. Third Maximum Number 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 替换最大值数组 使用set 三个变量 日期 题目地址 ...
 - 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...
 - POJ 2479 Maximum sum 解题报告
		
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40596 Accepted: 12663 Des ...
 
随机推荐
- nginx基础学习第二篇:nginx内置变量的使用
			
ngx_http_core模块提供的内置变量有很多,常见的有 $uri,用来获取当前请求的uri,不含请求参数. $request_uri,用来获取请求最原始的uri,包含请求参数,且未解码. $re ...
 - range() 和 np.arange()区别
			
range() 和 np.arange()区别 range(start,stop,step) 三个参数都必须是整数 np.arange()没有此类约束
 - linux CentOS中文输入法安装及设置
			
摘自百度空间,不错,一次搞定! centos 6.3用yum安装中文输入法 1.需要root权限,所以要用root登录 ,或su root 2.yum install "@Chinese S ...
 - [原]SuperMap GIS(JavaScript) 拉框放大和缩小功能实现
			
版权声明:本文为博主原创文章,未经博主允许不得转载. var ZoomControl; /* * 拉框缩小 */ function ZoomOut(){ if(ZoomControl==null||Z ...
 - JavaEE_XMind总结
			
1 Servlet 2 ServletContext 3 HttpServletResponse 4 HttpServletResquest 5 Cookie
 - 【debian】给用户添加sudo权限
			
新装的debian系统默认是没有sudo功能的. 于是,在root用户权限下: apt-get install sudo 然后再修改文件 /etc/sudoers : chmod +w /etc/su ...
 - ASP.NET MVC 域名泛解析设置
			
最近有个需求要做一个动态二级域名的网站,我们可以通过这样的方式去访问我们的网站 http://用户名.blog.com.而这里的用户名是根据程序的需要动态生成的.这里就会涉及到DNS服务器,要做相应的 ...
 - GITHUB一个新的项目发布
			
经过一段时间的积累,写了一些代码,发现好多功能有好几个系统都在用,但是公司的开发过程中,并没有一个对通用功能提取整合普遍化的一个流程,所以就自己将在项目开发过程中遇到的一些功能提取出来,并尽量做到普适 ...
 - 微信小程序-组件篇
			
一.摘要 组件是小程序整个语法中占比比较大的一部分,没写过组件可以说只懂了半个小程序.组件提供了类似页面的生命周期与逻辑.相比于模板,组件能实现的功能更加全面,也更为强大.通过slot可以自由扩展组件 ...
 - javascript array类型用法
			
javascript高级编程-Array引用类型用法总结 2016-09-17 | 357 引用类型-Array类型 引用类型是一种数据结构,用于将数据和功能联系起来. 创建对象的方式: ...