问题描述
小明在玩一个有趣的数字游戏:他有一排连续的数字积木,每个积木上写着一个整数(可能是正数或负数)。现在,他想找出这些积木中连续一段(子数组)的和的最大值 是多少。例如,如果积木序列是 [-2, 1, -3, 4, -1, 2, 1, -5, 4],那么连续和最大的子数组是 [4, -1, 2, 1],其和为 6。
请你帮助小明设计一个高效的算法,计算任意给定整数数组中连续子数组的最大和。
测试样例
样例1:
输入:
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]输出:6解释:最大和的连续子数组是 4, -1, 2, 1,和为 6。
样例2:
输入:
nums = [1, 2, 3, 4, 5]输出:15解释:整个数组的和最大,为 15。
样例3:
输入:
nums = [-1, -2, -3, -4]输出:-1解释:所有数字都是负数,最大子数组是单个元素 -1,和为 -1。
约束条件
- 1 ≤ nums.length ≤ 10⁵
- -10⁴ ≤ numsi ≤ 10⁴
- 要求算法时间复杂度为 O(n)
程序代码
#include <stdio.h>
int maxSubArray(int* nums, int numsSize) {
int currentSum = nums0;
int maxSum = nums0;
for (int i = 1; i < numsSize; i++) {
// 要么接续前面的子数组,要么从当前元素重新开始
if (currentSum + numsi > numsi) {
currentSum = currentSum + numsi;
} else {
currentSum = numsi;
}
if (currentSum > maxSum) {
maxSum = currentSum;
}
}
return maxSum;
}
int main() {
int nums1\[\] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int nums2\[\] = {1, 2, 3, 4, 5};
int nums3\[\] = {-1, -2, -3, -4};
printf("%d\n", maxSubArray(nums1, 9)); // 6
printf("%d\n", maxSubArray(nums2, 5)); // 15
printf("%d\n", maxSubArray(nums3, 4)); // -1
return 0;
}
cpp
#include <stdio.h>
int maxSubArray(int* nums, int numsSize) {
int currentSum = nums[0];
int maxSum = nums[0];
for (int i = 1; i < numsSize; i++) {
// 要么接续前面的子数组,要么从当前元素重新开始
if (currentSum + nums[i] > nums[i]) {
currentSum = currentSum + nums[i];
} else {
currentSum = nums[i];
}
if (currentSum > maxSum) {
maxSum = currentSum;
}
}
return maxSum;
}
int main() {
int nums1[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int nums2[] = {1, 2, 3, 4, 5};
int nums3[] = {-1, -2, -3, -4};
printf("%d\n", maxSubArray(nums1, 9)); // 6
printf("%d\n", maxSubArray(nums2, 5)); // 15
printf("%d\n", maxSubArray(nums3, 4)); // -1
return 0;
}
运行结果
