Task:
解决方案:
【1】暴力循环:
思路:
两层循环,第一层控制总的进度,第二层负责加并且验证;
每当第一层循环给定一个起点,第二层循环就会从这个起点开始往后遍历加(先加一个,再加两个等等), 每次加完都会把新得到的sum的值和当前的最大值res_max进行比较,一直到把最大的sum赋给res_max才停止,否则就一直遍历寻找!
时间复杂度:O(n2)
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if( nums.size() == 0) return NULL;
int res_max = nums[0];
int sum = 0;
for(int i=0; i < nums.size(); i++){
sum = 0;
for (int j=i; j < nums.size(); j++){
sum += nums[j];
if(sum > res_max) res_max = sum;
}
}
return res_max;
}
};
【2】动态规划
思路:给定初始化两个变量,res存放最终的结果,sum记录每次遍历时候的和,然后不断的在遍历中进行比较,取最大的!
注意点:初始化给res时候不能从0开始,因为有max函数,这一样就会忽略掉结果为负的情况,然后sum的复制感觉比较灵活,我试了0和-1都是可以的。但是-2和1就不行了!
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//【暴力算法】:
// if( nums.size() == 0) return NULL;
// int res_max = nums[0];
// int sum = 0;
// for(int i=0; i < nums.size(); i++){
// sum = 0;
// for (int j=i; j < nums.size(); j++){
// sum += nums[j];
// if(sum > res_max) res_max = sum;
// }
// }
// return res_max;
//【动态规划】:
if( nums.size() == 0 ) return NULL;
int res = INT_MIN; //初始化res
int sum = -1; //初始化试了0和-1均可以的!
for(int i=0; i < nums.size(); i++){
sum = max(nums[i], sum + nums[i]);
res = max(sum, res);
}
return res;
}
};
提交结果: