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
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.
这个稍微看了一下别人的解法,都是说用动态规划,感觉没那么麻烦。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项的值。
综上所示,所有情况已经考虑完毕。同时我们在完成扩展值数组的时候就可以找到最大值,因此每次比较一下即可。
伪代码:
代码:
博客链接: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; } }
相关文章推荐
- LeetCode:53. Maximum Subarray
- leetcode 53. Maximum Subarray
- Leetcode题解 - 53. Maximum Subarray
- leetcode_53. Maximum Subarray-子数组最大和
- [Leetcode]53. Maximum Subarray
- 【算法作业10】LeetCode 53. Maximum Subarray
- [LeetCode By Python]53. Maximum Subarray
- Leetcode题解 53. Maximum Subarray 思路解析
- LeetCode53. Maximum Subarray一种很好的做法
- Leetcode解题笔记 53. Maximum Subarray [Easy] 动态规划
- [LeetCode] 53. Maximum Subarray
- leetcode -- 53. Maximum Subarray
- 【leetcode】53. Maximum Subarray
- [LeetCode]53. Maximum Subarray
- 【C++】【LeetCode】53. Maximum Subarray
- [leetcode] 53. Maximum Subarray
- leetcode题解-53. Maximum Subarray && 448. Find All Numbers Disappeared in an Array
- 小白笔记-----------------------------leetcode53. Maximum Subarray
- LeetCode 53. Maximum Subarray
- Leetcode 53. Maximum Subarray