普通数组—最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
这是经典的动态规划问题,核心思路:遍历数组时,始终保留当前位置的最大连续子数组和,最终全局全最大值就是答案。
完整代码实现如下:
#include
#include
// 用于获取数组中的最小值,初始化最大和
#include
using namespace std;
// 核心函数:求解最大子数组和
int maxSubArray(vector
// 记录全局最大和,初始化为int最小值(保证任何数都比它大)
int max_sum = INT_MIN;
// 记录当前连续子数组的和
int current_sum = 0;
for (int num : nums) {
// 关键:当前和 = 直接加当前元素 VS 从当前元素重新开始,取更大值
current_sum = max(num, current_sum + num);
// 更新全局最大和
max_sum = max(max_sum, current_sum);
}
return max_sum;
}
// 测试主函数
int main() {
// 测试用例1:常规情况
vector
cout << "最大子数组和:" << maxSubArray(nums1) << endl; // 输出 6
// 测试用例2:全负数
vector
cout << "最大子数组和:" << maxSubArray(nums2) << endl; // 输出 -1
return 0;
}
核心逻辑解释:
- current_sum:表示以当前元素结尾的连续子数组的最大和
- 如果之前的和是负数,加当前元素会更小 → 直接从当前元素重新开始
- 如果之前的和是正数,加当前元素会更大 → 继续累加
- max_sum:遍历过程中,始终记录所有 current_sum 中的最大值
- 时间复杂度:O(n)(只遍历数组一次)
- 空间复杂度:O(1)(只用了两个变量
浙公网安备 33010602011771号