给你一个整数数组 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
要解决这个问题,我们可以使用著名的Kadane’s算法。这个算法的核心思想是通过动态规划来寻找具有最大和的连续子数组。具体来说,我们在遍历数组时,保持当前子数组的和,并在每一步与之前的最大和进行比较。下面是实现的步骤和相应的 C++ 代码示例:
Kadane’s Algorithm 实现步骤
-
初始化:
currentSum
用于记录当前子数组的和,初始化为数组的第一个元素(确保至少包含一个元素)。maxSum
用于记录当前找到的最大和,初始值同样为第一个元素。
-
遍历数组:
- 从第二个元素开始遍历:
- 在每一步中,比较
currentSum + nums[i]
与nums[i]
,选择较大的值作为新的currentSum
。这样做是因为我们要决定是否继续累加当前子数组,或者从当前元素开始新的子数组。 - 更新
maxSum
,即为当前maxSum
与currentSum
的较大值。
- 在每一步中,比较
- 从第二个元素开始遍历:
-
返回结果:
- 遍历结束后,
maxSum
就是所求的最大和。
- 遍历结束后,
C++ 代码实现
以下是完整的 C++ 实现代码:
#include <iostream>
#include <vector>
#include <algorithm> // 为了使用 std::max
int maxSubArray(const std::vector<int>& nums) {
if (nums.empty()) {
return 0; // 处理空数组情况
}
int currentSum = nums[0]; // 初始当前和为第一个元素
int maxSum = nums[0]; // 初始最大和为第一个元素
for (size_t i = 1; i < nums.size(); ++i) {
currentSum = std::max(nums[i], currentSum + nums[i]); // 选择继续加或重新开始
maxSum = std::max(maxSum, currentSum); // 更新最大和
}
return maxSum; // 返回最大和
}
int main() {
std::vector<int> nums1 = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
std::vector<int> nums2 = {1};
std::vector<int> nums3 = {5, 4, -1, 7, 8};
std::cout << "最大和 (示例 1): " << maxSubArray(nums1) << std::endl; // 输出 6
std::cout << "最大和 (示例 2): " << maxSubArray(nums2) << std::endl; // 输出 1
std::cout << "最大和 (示例 3): " << maxSubArray(nums3) << std::endl; // 输出 23
return 0;
}
代码解析
std::max
: 用于比较两个值,选择较大的一个。- 主函数
maxSubArray
: 接收一个整数向量并返回具有最大和的连续子数组的和。 - 迭代逻辑: 在for循环中,
currentSum
被不断更新,表示当前可能的最大子数组和,maxSum
则用于存储到目前为止的最大和。
测试
上述代码在 main
函数中测试了三个示例,可以直接运行并查看输出。
这个实现是有效的,并且具有 O(N) 的时间复杂度,适合处理大规模的输入数组。如果你有其他问题或想要讨论更深层次的内容,请随时提问!