题目描述:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
解题思路:
一开始,最简单的想法就是计算前缀和,sum[i]-sum[i]就是连续子数组的和。
就是复杂度是O(n^2),写出来果不其然超时了。
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> sum(n+1,0);
for(int i=1;i<=n;i++){
sum[i] = sum[i-1] + nums[i-1];
}
int res = nums[0];
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
res = max(res, sum[i]-sum[j]);
}
}
return res;
}
仔细想了想,还是应该用动态规划。
针对每个元素,考虑是否加上前面的元素和。只要加上,比当前元素大,就加上,否则舍弃。
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int res = nums[0];
for(int i=1;i<n;i++){
nums[i] = max(nums[i], nums[i]+nums[i-1]);
res = max(res, nums[i]);
}
return res;
}