您的位置:首页 > 编程语言 > Java开发

Leetcode-53. Maximum Subarray

2016-10-05 22:03 507 查看
前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

——————————————————————————————

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.
这个稍微看了一下别人的解法,都是说用动态规划,感觉没那么麻烦。Your runtime beats 28.70%
of java submissions.
这个思路是在路上想出来的,主要是觉得这个不是dp问题,因为没有最优子结构。因此换个角度思考本问题,当我们从左到右到达一个项的时候,我们是否考虑再延伸,肯定是希望下一个项告诉我往它右边延伸还有没有增大项,即当前结果还可以不可以变大。所以我们就从右到左先扫一遍,用一个额外的空间告诉我们是否右边还有增大项。



举例说明:
1、首先最后一项,因为它右边没有元素了,所以我们就认为它的扩展值为0,即不需要扩展。
2、第7项,我们发现第8项是正值,同时扩展值为0,因此代表我们在第七项的时候应该往第8项扩展,扩展值为4。
3、第6项,发现第7项的扩展值是4,但是第7项本身的值是-5,因此如果往7扩展,最多得到-5+4=-1,因此第六项的扩展值为-1。
4、第5项,发现第6项的扩展值为-1,即如果再往后扩展就要变小了,因此不考虑后面的值,第5项的扩展值就是第6项的值。
综上所示,所有情况已经考虑完毕。同时我们在完成扩展值数组的时候就可以找到最大值,因此每次比较一下即可。

伪代码:

for i  <- nums.length -1 to 0
if i = nums.length -1
then  extends[i] = 0
else {
if extends[i + 1] < 0
then extends[i] := nums[i+1]
else extends[i] := extends[i+1] + nums[i+1]
if extends[i] > largestNum
then largestNum := extends[i]
}


代码:

public class Solution {
public int maxSubArray(int[] nums) {

if(nums.length == 0) return 0;
if(nums.length == 1) return nums[0];

int[] extendsArray = new int[nums.length + 1];
int largestNum = Integer.MIN_VALUE;
for(int i = nums.length - 1 ; i >= 0 ; i--){

if( i == nums.length - 1) extendsArray[i] = 0;
else{
if(extendsArray[i + 1] < 0) extendsArray[i] = nums[i+1];
else extendsArray[i] = extendsArray[i+1] + nums[i+1];
if(extendsArray[i] > largestNum) largestNum = extendsArray[i];
}

}
if(extendsArray[0] < 0) extendsArray[nums.length] = nums[0];
else extendsArray[nums.length] = extendsArray[0] + nums[0];
if(extendsArray[nums.length] > largestNum) largestNum = extendsArray[nums.length];

return largestNum;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode 算法