题目描述
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.
Difficulty : Easy
题目解读
题目要求找到相加和最大的连续子数列,一开始看这道题很像找出某函数积分值最大的连续区间。所以设置一个变量largest,时刻记录当前元素总和最大值的情况。
另一个变量sum记录所有元素总和,当总和变负时将sum清零,重新开始计算。
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int size = nums.size();
int largest = nums[0];
int sum = 0;
for(int i = 0; i < size; i++){
sum += nums[i];
if(sum > largest) largest = sum;
if(sum < 0) sum = 0;
}
return largest;
}
};
如果用到分治思想的话,考虑将数组分为左右两个部分,累加和最大的子数列可能出现在左边或者右边,或者中间部分。因此需要逐步计算出含最左元素的子列最大和,含最右元素的最大子列和,以及中间子列的最大和。最后将结果汇总。
class Solution {
public:
void findmax(vector<int>& nums, int l, int r, int &maxx, int &lm, int &rm, int &sum){
if(l == r) lm = rm = sum = maxx = nums[l];
else{
int mid = (l + r) / 2;
int lmax, rmax, llm, lrm, rlm, rrm, lsum, rsum;
findmax(nums, l, mid, lmax, llm, lrm, lsum);
findmax(nums, mid + 1, r, rmax, rlm, rrm, rsum);
maxx = max(max(lmax, rmax), lrm + rlm);
lm = max(llm, lsum + rlm);
rm = max(rrm, rsum + lrm);
sum = lsum + rsum;
}
}
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0) return 0;
else{
int max, lm, rm, sum;
findmax(nums, 0, nums.size() - 1, max, lm, rm, sum);
return max;
}
}
};