题目描述
leetcode原题链接:最大子数组和
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。
举例
示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:输入:nums = [1] 输出:1
示例 3:输入:nums = [5,4,-1,7,8] 输出:23
解题方法:用两个变量sum和max_sum分别表示最近连续子数组的和以及最大和,如果当前sum小于0,则将其设置为0,max_sum每次用max(max_sum, sum)去更新。
代码
#include <iostream>
#include <vector>
int max_sum(const std::vector<int>& nums) {
int n = nums.size();
if (n <= 0) {
return 0;
}
int sum = 0;
int max_sum = nums[0];
for (int i = 0; i < n; i++) {
if (sum < 0) {
sum = 0;
}
sum += nums[i];
max_sum = std::max(sum, max_sum);
}
return max_sum;
}
void print_result(const std::vector<int>& nums,
int result) {
std::cout << "========" << std::endl;
std::cout << "input:" << std::endl;
for (auto num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "output:" << std::endl;
std::cout << "max_sum:" << result << std::endl;
}
int main()
{
// case1 : nums=[-2,1,-3,4,-1,2,1,-5,4]==> 6
std::vector<int> nums = {1, 2, 3};
int result;
result = max_sum(nums);
print_result(nums, result);
// case2 : nums = [1] ==> 1
nums = {1};
result = max_sum(nums);
print_result(nums, result);
// case3: nums = [5,4,-1,7,8] ==> 23
nums = {5, 4, -1, 7, 8};
result = max_sum(nums);
print_result(nums, result);
// case4: [-2,1,-3,4,-1,2,1,-5,4] ==> 6
nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
result = max_sum(nums);
print_result(nums, result);
return 0;
}
代码运行结果:
========
input:
1 2 3
output:
max_sum:6
========
input:
1
output:
max_sum:1
========
input:
5 4 -1 7 8
output:
max_sum:23
========
input:
-2 1 -3 4 -1 2 1 -5 4
output:
max_sum:6