Leetcode Maximum Subarray
2015-10-21 01:38
513 查看
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
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.
sum[i] = max(nums[i], nums[i] + sum[i-1])
The changing condition for dynamic programming is "We should ignore the sum of the previous n-1 elements if nth element is greater than the sum."
试想一下,如果我们从头遍历这个数组。对于数组中的其中一个元素,它只有两个选择:
1. 要么加入之前的数组加和之中(跟别人一组)
2. 要么自己单立一个数组(自己单开一组)
所以对于这个元素应该如何选择,就看他能对哪个组的贡献大。如果跟别人一组,能让总加和变大,还是跟别人一组好了;如果自己起个头一组,自己的值比之前加和的值还要大,那么还是自己单开一组好了。
所以利用一个sum数组,记录每一轮sum的最大值,sum[i]表示当前这个元素是跟之前数组加和一组还是自己单立一组好,然后维护一个全局最大值即位答案。
Java code:
第一种写法:
第二种写法: sum不用数组,只用一个int
Reference:
1. http://www.programcreek.com/2013/02/leetcode-maximum-subarray-java/
2. http://www.programcreek.com/2013/02/leetcode-maximum-subarray-java/
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.
解题思路:
Dynamic Programming.sum[i] = max(nums[i], nums[i] + sum[i-1])
The changing condition for dynamic programming is "We should ignore the sum of the previous n-1 elements if nth element is greater than the sum."
试想一下,如果我们从头遍历这个数组。对于数组中的其中一个元素,它只有两个选择:
1. 要么加入之前的数组加和之中(跟别人一组)
2. 要么自己单立一个数组(自己单开一组)
所以对于这个元素应该如何选择,就看他能对哪个组的贡献大。如果跟别人一组,能让总加和变大,还是跟别人一组好了;如果自己起个头一组,自己的值比之前加和的值还要大,那么还是自己单开一组好了。
所以利用一个sum数组,记录每一轮sum的最大值,sum[i]表示当前这个元素是跟之前数组加和一组还是自己单立一组好,然后维护一个全局最大值即位答案。
Java code:
第一种写法:
public class Solution { public int maxSubArray(int[] nums) { int len = nums.length; int[] sum = new int[len]; int max = nums[0]; sum[0] = nums[0]; for(int i = 1; i< len; i++) { sum[i] = Math.max(nums[i], nums[i] + sum[i-1]); max = Math.max(max, sum[i]); } return max; } }
第二种写法: sum不用数组,只用一个int
public class Solution { public int maxSubArray(int[] nums) { int sum = nums[0]; int max = nums[0]; for(int i = 1; i< nums.length; i++) { sum = Math.max(nums[i], nums[i] + sum); max = Math.max(max, sum); } return max; } }
Reference:
1. http://www.programcreek.com/2013/02/leetcode-maximum-subarray-java/
2. http://www.programcreek.com/2013/02/leetcode-maximum-subarray-java/
相关文章推荐
- 硬盘安装Ubuntu
- 对于给定的一组数据,用weka怎么进行预测?
- 云服务器挂载不了数据盘(急用,求大神解答)好人一生平安
- "openvswitch
- eclipse中运行wordcount任务后在hadoop0.20.2监控页面没有显示该job的问题
- smtp时常要重启才能收发邮件
- leetcode笔记:Longest Common Prefix
- smtp时常要重启才能收发邮件
- smtp时常要重启才能收发邮件
- 深入理解Activity -动手写实例来感受Activity的启动模式
- smtp时常要重启才能收发邮件
- html总结1
- 深入理解Activity -动手写实例来感受Activity的启动模式
- 华为最新桌面云解决方案特性视频来袭(2014年7月揭开神秘面纱^_^)!
- docker里下的centos是一个只读文件系统?我修改/etc/hosts都修改不了,怎么破
- "X5650
- LeetCode OJ 9 Palindrome Number
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(10月12日~10月18日)
- 周记 - 10.20
- spark运行自例子