📜  将负数作为总和包含在内的 kadane 算法 - C++ (1)

📅  最后修改于: 2023-12-03 15:39:20.450000             🧑  作者: Mango

将负数作为总和包含在内的 Kadane 算法 - C++

Kadane算法也称为最大子段和算法,用于解决找出给定数组中最大的子数组(连续的一部分数组)的和。然而,原版算法不包括负数,这意味着如果数组中存在负数,则它无法找到最大子数组。

这里将介绍将负数包含在内的 Kadane 算法,并给出其 C++ 实现。

算法实现
Kadane 算法的原理

Kadane算法的核心思想是通过不断比较之前的最大子数组和当前元素的大小来找到最大子数组。具体来说,算法维护一个累加器 currentSum 和一个最大和 maxSum,不断将当前元素加入 currentSum 中并与 maxSum 进行比较,如果 currentSum 大于 maxSum,则更新 maxSum

这里的变化在于,当 currentSum 变为负数时,我们将其重置为0。这样,如果整个数组都是负数,算法将返回最大的负数。如果存在正数,算法将找到最大正和(包括正和负)的子数组。

以下是 Kadane 算法的 C++ 实现:

int kadane(vector<int>& nums) {
    int maxSum = INT_MIN;
    int currentSum = 0;
    for (int i = 0; i < nums.size(); i++) {
        currentSum += nums[i];
        if (currentSum > maxSum) {
            maxSum = currentSum;
        }
        if (currentSum < 0) {
            currentSum = 0;
        }
    }
    return maxSum;
}
算法测试

我们对这个算法进行测试:

int main() {
    vector<int> nums1 = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    cout << kadane(nums1) << endl; // Expected output: 6
    
    vector<int> nums2 = {-2, -3, -1, -5};
    cout << kadane(nums2) << endl; // Expected output: -1
    
    vector<int> nums3 = {2, -3, 4, -1, 2, 1, -5, 4};
    cout << kadane(nums3) << endl; // Expected output: 6
    
    return 0;
}

输出:

6
-1
6
总结

Kadane 算法是一种用于查找最大子数组的优秀算法。在实现算法时,我们不仅要理解其背后的原理,还应该注意算法的局限性,并且更好地理解其复杂性。