给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
分析:
1. 暴力遍历每一种可能,会超时
2. 暴力遍历每一种可能,但是会利用以前的结果,没有超时
3. 还有一种解法看不懂
// 超时的解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 先尝试n^3的解法
// 遍历数组,以每一个数开始的1,2,3,4,5.。。等的最大和记录下来
int max = INT_MIN;
for(int i=0; i<nums.size(); i++){
// 保存当前数开头的最大值
int curr_max = INT_MIN;
for(int j=1; j<=nums.size(); j++){
int curr_sum = 0;
for(int k=0; k<j; k++){
if(i+k >= nums.size())
break;
curr_sum += nums[i+k];
}
curr_max = curr_max>curr_sum?curr_max:curr_sum;
}
max = max>curr_max?max:curr_max;
}
return max;
}
};
// 不超时的解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// n^2的解法
// 遍历数组,以每一个数开始的1,2,3,4,5.。。等的最大和记录下来
int max = INT_MIN;
for(int i=0; i<nums.size(); i++){
// 当前的和
// [-2,1,-3,4,-1,2,1,-5,4]
int curr_sum = 0;
// 保存当前数开头的最大值
int curr_max = INT_MIN;
for(int j=i; j<nums.size(); j++){
curr_sum += nums[j];
curr_max = curr_sum>curr_max?curr_sum:curr_max;
}
max = max>curr_max?max:curr_max;
}
return max;
}
};