普通数组—最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

这是经典的动态规划问题,核心思路:遍历数组时,始终保留当前位置的最大连续子数组和,最终全局全最大值就是答案。

完整代码实现如下:

#include
#include
// 用于获取数组中的最小值,初始化最大和
#include
using namespace std;

// 核心函数:求解最大子数组和
int maxSubArray(vector& nums) {

// 记录全局最大和,初始化为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 nums1 = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
cout << "最大子数组和:" << maxSubArray(nums1) << endl; // 输出 6

// 测试用例2:全负数
vector nums2 = {-1, -2, -3};
cout << "最大子数组和:" << maxSubArray(nums2) << endl; // 输出 -1

return 0;

}

核心逻辑解释:

  1. current_sum:表示以当前元素结尾的连续子数组的最大和
  • 如果之前的和是负数,加当前元素会更小 → 直接从当前元素重新开始
  • 如果之前的和是正数,加当前元素会更大 → 继续累加
  1. max_sum:遍历过程中,始终记录所有 current_sum 中的最大值
  2. 时间复杂度:O(n)(只遍历数组一次)
  3. 空间复杂度:O(1)(只用了两个变量
posted @ 2026-03-29 08:55  ZealousMclaren  阅读(20)  评论(0)    收藏  举报