leetcode编程记录2 #53 Maximum Subarray
标签(空格分隔): leetcode
这次这道题是运用了分治思想的一道题,题目如下:
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.
题目分析:
首先分析题意可知,题目要求我们找出给定数组中的子数组中的和最大的子数组的和。
起初我首先是利用暴力解法来做的,首先计算出给定数组的和,之后逐步缩小数组的规模,然后分别求它们的和,以下是c++代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxResult = sum(nums, 0, nums.size() - 1);
for (int i = 1; i < nums.size(); i++)
{
for (int j = 0; j <= i; j++)
{
int temp = sum(nums, j, nums.size() - i - 1 + j);
if(temp > maxResult)
{
maxResult = temp;
}
}
}
return maxResult;
}
int sum(vector<int>& nums, int start, int end)
{
int result = 0;
for (int i = start; i <= end; i++)
{
result = result + nums[i];
}
return result;
}
};
这样做的话肯定是无法通过的,因为这样做的时间复杂度是O(n^3)的,这超过了它所给的时间限制。之后结合题目意思和题目讨论我了解到这道题其实可以利用动态规划的方法来做,这有点类似于分治算法,首先我们可以将求该数组的子数组中最大和化成一个小问题来解决,先求一个局部的最大,之后扩展数组的时候再求扩展的数组和增加的元素之间的最大值,最后再将其与全局的最大值作比较得到一个最终的最大值,c++代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxResult = nums[0];
int localMax = maxResult;
for (int i = 1; i < nums.size(); i++)
{
localMax = max(localMax + nums[i], nums[i]);
maxResult = max(maxResult, localMax);
}
return maxResult;
}
};
最后得到的这个方法的时间复杂度为O(n),符合题目的要求。