53. 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
.
题意:
求一个数字的子数组(连续的一部分)中元素和的最大值。
解答①:
第一种思路是很容易想到的暴力求解。就是算出每一种sum的值,然后在里面找最大的。
代码:[cpp] view plain
class Solution { public : int maxSubArray(vector< int >& nums) { int sum=0; int maxSum=INT_MIN; int len=nums.size(); for ( int i=0;i<len;i++){ sum=0; for ( int j=i;j<len;j++){ sum+=nums[j]; if (sum>maxSum) maxSum=sum; } } return maxSum; } };
复杂度:
很容易看得出来,时间复杂度是O(n^2)。这个时间复杂度太大啦,在leetcode上面提交直接是超时啦!
解答②:
是一个比较典型的动态规划的问题。对于连续最大的和,当前的和一定是之前的和或者加了新元素的和两者中的较大者。
代码:
这里给出了两段代码其实都是一种思路,我交了两次所以就都贴上来吧
[cpp] view plain
class Solution { public : int maxSubArray(vector< int >& nums) { int sum=0; int maxSum=INT_MIN; int len=nums.size(); for ( int i=0;i<len;i++){ sum=max(nums[i],sum+nums[i]); maxSum=max(sum,maxSum); } return maxSum; } };
class Solution { public : int maxSubArray(vector< int >& nums) { int maxSum=INT_MIN; int sum=0; int len=nums.size(); for ( int i=0;i<len;i++){ if (sum>=0) sum+=nums[i]; else sum=nums[i]; if (sum>maxSum) maxSum=sum; } return maxSum; } };
复杂度:
因为只对数组进行了一次遍历哦,所以时间复杂度就是O(n)。这时候leetcode就不会说超时啦。