问题描述
// 寻找最大子数组和
// 给定一个整型数组,其中元素可正可负。
// 目标是从这个数组中找到一个连续的子序列(子数组),使得该子序列的所有元素之和最大。
// 要求算法的时间复杂度为O(n)。
// 例如,对于输入数组 [1, -2, 3, 10, -4, 7, 2, -5],和最大的子数组是 [3, 10, -4, 7, 2],其和为 18。
解题思路
解决这个问题的一种高效方法是使用动态规划的思想,具体来说就是Kadane算法。通过一次遍历数组,我们可以计算出以当前元素结尾的最大子数组和。同时,我们还需要跟踪整个过程中遇到的最大和,以及该最大和对应的子数组起始和结束位置。
实现代码
int findMaxSubarraySum(int* arr, int n, int* start, int* end) {
int maxSoFar = arr[0], maxEndingHere = arr[0];
*start = *end = 0;
int s = 0;
for (int i = 1; i
maxEndingHere += arr[i];
} else {
maxEndingHere = arr[i];
s = i;
}
if (maxSoFar
*start = s;
*end = i;
}
}
return maxSoFar;
}