leecode 53 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
方法一:
最简单的方法,维护一个最大值和一个当前和,当最大值比当前和小则更新最大值,当前和为负数,且当前值比当前和大,更新当前和为当前值。
代码:
int Leecode53_maxSubArray(std::vector<int>& nums) {
if (nums.size() <=1)
return nums.size()==1 ? nums[0] : 0;
int sum_max = nums[0];
int sum_cur = nums[0];
for (int i = 1; i < nums.size(); i++){
if (sum_cur < 0 && nums[i] >sum_cur) {
sum_cur = nums[i];
if (sum_cur > sum_max)
sum_max = sum_cur;
}else{
sum_cur += nums[i];
if (sum_max < sum_cur)
sum_max = sum_cur;
}
}
return sum_max;
}
方法二:
动态规划法:如果前一位为正数,则和当前数相加最为新的值。最后从新的数组找最大值。
代码:
int Leecode53_02_maxSubArray(std::vector<int>& nums) {
if (nums.size() <=1) return nums.size()==1?nums[0]:0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i-1] > 0)
nums[i] = nums[i-1] + nums[i];
}
return *(std::max_element(nums.begin(), nums.end()));
}