LeetCode-Maximum Subarray
2015-08-25 15:59
429 查看
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
the contiguous subarray
非常一道经典的一维动态规划题。Maximum subarray problem WIKI上也有关于这道题的解答,此算法为Kadane's algorithm。
解法非常直观,maxEndingHere是指以sum(0, i),即起点为o,终点为i这一段的最大值。而此时对于第i个元素有两个选择,要么加入之前的和之中,即maxEndingHere+nums[i],否则不用之前的和。取最大值即可。公式表示为:
sum[i] = max(nums[i], sum[i-1] + nums[i+1])
result = max(result, sum[i])
显然nums[i]与nums[i]+sum[i-1]孰大孰小,完全取决于sum[i-1]的正负,所以代码也可以这样写:
这个算法还是比较经典的,好多算法也用到了这个特性,比如,maxEndingHere或者maxBeginingHere。
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.
非常一道经典的一维动态规划题。Maximum subarray problem WIKI上也有关于这道题的解答,此算法为Kadane's algorithm。
public int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) return 0; int maxSoFar = nums[0]; int maxEndingHere = nums[0]; for (int i = 1; i < nums.length; i++) { maxEndingHere = Math.max(nums[i], maxEndingHere+nums[i]); maxSoFar = Math.max(maxSoFar, maxEndingHere); } return maxSoFar; }
解法非常直观,maxEndingHere是指以sum(0, i),即起点为o,终点为i这一段的最大值。而此时对于第i个元素有两个选择,要么加入之前的和之中,即maxEndingHere+nums[i],否则不用之前的和。取最大值即可。公式表示为:
sum[i] = max(nums[i], sum[i-1] + nums[i+1])
result = max(result, sum[i])
显然nums[i]与nums[i]+sum[i-1]孰大孰小,完全取决于sum[i-1]的正负,所以代码也可以这样写:
public int maxSubArray(int[] A) { if (A == null || A.length == 0) { return 0; } int max = A[0]; int curSum = A[0]; for (int i = 1; i < A.length; i++) { if (curSum < 0) { curSum = A[i]; } else { curSum += A[i]; } if (max < curSum) { max = curSum; } } return max; }
这个算法还是比较经典的,好多算法也用到了这个特性,比如,maxEndingHere或者maxBeginingHere。
相关文章推荐
- PullToRefreshScrollView包含复杂组合控件时的页面定位问题
- 第一章 词汇陷阱
- Java写程序猿专访String2
- 代码里手动编写UI
- 使用dom4j对xml操作【转】
- Java中的hashCode 方法
- C++ 11开发环境的搭建(Windows Platform)
- 替换一个字符串中首次出现的字符为特定字符
- 解决:A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint.
- free命令
- 归并排序
- poj1860
- Objective-C实现信用卡校验
- ndk-stack的使用
- Ajax - 登录
- linux增加硬盘操作步骤
- 安卓代码混淆注意事项
- 【c++】猜单词游戏
- Des算法的实现
- Openssl编程初探