leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法
Maximum Subarray
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.
click to show more practice.
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.
思路:这题在刚開始想用双指针解,可是码代码的时候发现双指针不行,感觉不是非常难的一个题。最后还是要求助网上资料。经过翻找,一个非常好的博文详解了本题的算法思想。非常清晰,故摘录在下:
http://blog.csdn.net/joylnwang/article/details/6859677
又一个经典问题。对于一个包括负值的数字串array[1...n],要找到他的一个子串array[i...j](0<=i<=j<=n),使得在array的全部子串中。array[i...j]的和最大。 这里我们须要注意子串和子序列之间的差别。 子串是指数组中连续的若干个元素。而子序列仅仅要求各元素的顺序与其在数组中一致,而没有连续的要求。对于一个元素数为n的数组,其含有2^n个子序列和n(n+1)/2个子串。假设使用穷举法,则至少须要O(n^2)的时间才干得到答案。卡耐基梅隆大学的Jay Kadane的给出了一个线性时间算法,我们就来看看。怎样在线性时间内解决最大子串和问题。 要说明Kadane算法的正确性,须要两个结论。 首先。对于array[1...n],假设array[i...j]就是满足和最大的子串,那么对于不论什么k(i<=k<=j),我们有array[i...k]的和大于0。因为假设存在k使得array[i...k]的和小于0。那么我们就有array[k+1...j]的和大于array[i...j],这与我们假设的array[i...j]就是array中和最大子串矛盾。 其次,我们能够将数组从左到右切割为若干子串,使得除了最后一个子串之外,其余子串的各元素之和小于0,且对于全部子串array[i...j]和随意k(i<=k<j)。有array[i...k]的和大于0。 此时我们要说明的是。满足条件的和最大子串,仅仅能是上述某个子串的前缀。而不可能跨越多个子串。我们假设array[p...q]。是array的和最大子串,且array[p...q]。跨越了array[i...j],array[j+1...k]。依据我们的分组方式,存在i<=m<j使得array[i...m]的和是array[i...j]中的最大值,存在j+1<=n<k使得array[j+1...n]的和是array[j+1...k]的最大值。 因为array[m+1...j]使得array[i...j]的和小于0。此时我们能够比較array[i...m]和array[j+1...n]。假设array[i...m]的和大于array[j+1...n]则array[i...m]>array[p...q]。否array[j+1...n]>array[p...q]。不管谁大,我们都能够找到比array[p...q]和更大的子串。这与我们的假设矛盾。所以满足条件的array[p...q]不可能跨越两个子串。 对于跨越很多其它子串的情况,因为各子串的和均为负值。所以相同能够证明存在和更大的非跨越子串的存在。 对于单元素和最大的特例,该结论也适用。 依据上述结论,我们就得到了Kadane算法的运行流程,从头到尾遍历目标数组,将数组切割为满足上述条件的子串,同一时候得到各子串的最大前缀和,然后比較各子串的最大前缀和,得到终于答案。我们以array={−2, 1, −3, 4, −1, 2, 1, −5, 4}为例,来简单说明一下算法步骤。通过遍历。能够将数组切割为例如以下3个子串(-2)。(1。-3),(4。-1,2,1,-5,4)。这里对于(-2)这种情况。单独分为一组。各子串的最大前缀和为-2,1,6,所以目标串的最大子串和为6。
我的代码,上面博文的代码有些繁琐。
public class Solution {
public int maxSubArray(int[] nums) {
int max = Integer.MIN_VALUE;//设置最小值
int sum = 0;//每一个分组的和
int i = 0;
while(i < nums.length){
sum += nums[i];//每一个分组的前n项和
if(max < sum){
max = sum;//取最大和
}
if(sum < 0){//假设<0。分组结束,開始下一组
sum = 0;
}
i++;
}
return max;
}
}
leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法的更多相关文章
- [array] leetcode - 53. Maximum Subarray - Easy
leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- 【剑指Offer】连续子数组的最大和 解题报告(Python)
[剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 41. leetcode 53. Maximum Subarray
53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...
- Leetcode#53.Maximum Subarray(最大子序和)
题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...
- LN : leetcode 53 Maximum Subarray
lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- [LeetCode] 53. Maximum Subarray 最大子数组
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- C#解leetcode 53.Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
随机推荐
- IBM总架构师寇文东谈程序员的职业规划
有些年轻的程序员向我咨询,将来的路该怎么走?俗话说,条条大路通罗马.不同的路都能走向成功,到底选择哪条路,取决于自己的兴趣.可能有程序员会问:如果还没有找到自己的兴趣怎么办?我的建议是多尝试,努力做, ...
- Leaflet学习笔记-基础内容
为什么选择Leaflet 开源,且代码仅有 31 KB,但它具有开发人员开发在线地图的大部分功能(80%的功能) 是不是比arcgis要小很多呢 官网:http://leafletjs.com/ 劣势 ...
- App评分
//应用实现评论跳转的两种方法: //第一种: //在iOS6.0前跳转到AppStore评分一般是直接跳转到AppStore评分 //NSString *evaluateString = [NSSt ...
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
Description Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高 ...
- Codeforces Round #197 (Div. 2) : C
哎....这次的比赛被安叔骂的好惨! 不行呢,要虐回来: 这道搜索,老是写错,蛋疼啊! 果然是基础没打好! #include<cstdio> using namespace std; ], ...
- 一周一话题之一(EF-CodeFirst、MEF、T4框架搭建学习)
本话题是根据郭明峰博客<MVC实用架构系列>的搭建学习总结. -->目录导航 一.数据仓储访问的构建 1.UnitOfWork的构建 2.Repository的构建 ...
- UITableView.m:8042 crash 崩溃
CRASH : /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.6.21/UITableView.m:804 ...
- [转贴]C++开源库
C++在“商业应用”方面,曾经是天下第一的开发语言,但这一 桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又突然发力,搞出C# ...
- 在VS2008中配置WDK7600驱动开发环境
网上这类资料多如牛毛,也许很多人都是转来转去,却很有人去真正的测试,有时候感觉确实对他人也是一种误导. 这里是我自己在VS2008 + WDK7600.16385.0 + DDKWizard配置自己的 ...
- paip.php eclipse output echo 乱码
paip.php eclipse output echo 乱码 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.c ...