Maximum subarray -- 最大子数组问题(C++)

    题目

    输入一个整形数组,数组中有正数有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组和的最大值。

    一、暴力破解

    直接对数组进行暴力求解,复杂度为O(n^2),代码如下:

template<typename T>
tuple<int, int, T> findMaximumSubArray(const vector<T> &arr)
{
    assert(arr.size());

    int left = 0, right = 0;
    T sum = arr[0];

    for(int i = 0; i < arr.size() - 1; ++i)
    {
        int tmpLeft = 0;
        T tmpSum = numeric_limits<T>::min();
        T tmp = 0;
        for(int j = i + 1; j >= 0; --j)
        {
            tmp += arr[j];
            if(tmpSum < tmp)
            {
                tmpSum = tmp;
                tmpLeft = j;
            }
        }

        if(tmpSum > sum)
        {
            sum = tmpSum;
         
最大子数组问题旨在寻找给定整数数组中连续子数组最大和。在C++中,可以使用经典的 **Kadane's Algorithm** 来高效解决这一问题。该算法基于动态规划的思想,能够在 **O(n)** 的时间复杂度内完成计算。 以下是一个完整的 C++ 实现示例,展示了如何使用 Kadane’s 算法来求解最大子数组和: ```cpp #include <iostream> #include <vector> #include <climits> using namespace std; int maxSubArray(vector<int>& nums) { int max_current = nums[0]; int max_global = nums[0]; for (size_t i = 1; i < nums.size(); ++i) { max_current = max(nums[i], max_current + nums[i]); max_global = max(max_global, max_current); } return max_global; } int main() { vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; int result = maxSubArray(nums); cout << "Maximum Subarray Sum: " << result << endl; return 0; } ``` ### 代码说明: - `max_current` 表示当前子数组最大和。 - `max_global` 用于记录遍历过程中出现的最大子数组和。 - 在每次迭代中,算法决定是继续扩展当前子数组,还是以当前元素作为新的子数组的起点。 - 最终,`max_global` 将保存整个数组中最大子数组的和。 ### 时间和空间复杂度: - **时间复杂度**:O(n),其中 n 是数组的长度。 - **空间复杂度**:O(1),仅使用了常数级别的额外空间。 这种实现方式非常高效,适用于大规模输入数据,例如在 LeetCode 等在线评测平台上,能够很好地应对数据范围限制(如 `1 <= nums.length <= 10^5`)[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值