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
最大子数组问题是经典的动态规划问题之一,目标是从给定的整数数组中找到连续子数组最大和。以下是解决该问题的基本思路以及用C++实现的方式: ### 解题思路 可以采用Kadane算法来高效解决问题: 1. 初始化两个变量 `maxSum` 和 `currentSum`,分别表示全局最大子数组和及当前计算到的位置为止的最佳结果。 2. 遍历整个数组,在每一步更新 `currentSum = max(nums[i], currentSum + nums[i])`,这代表对于当前位置i来说,判断是否将之前的结果加入还是从新开始计数更优。 3. 每次更新完 `currentSum` 后立即检查并更新 `maxSum = max(maxSum, currentSum)`。 这种做法的时间复杂度仅为O(n),非常高效。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int MaxSubArray(vector<int>& nums) { int maxSum = nums[0]; int currentSum = nums[0]; for (size_t i = 1; i < nums.size(); ++i){ // 判断是延伸之前的序列好,还是重新开始一个新的序列更好 currentSum = max(nums[i], currentSum + nums[i]); if(currentSum > maxSum) maxSum = currentSum; } return maxSum; } int main(){ vector<int> arr {-2, 1,-3,4,-1,2,1,-5,4}; cout << "The maximum subarray sum is: " << MaxSubArray(arr); } ``` 上面程序示例了如何寻找{-2,1,-3,4,-1,2,1,-5,4}这个数组里最大的连续子数组之和,并打印出结果6(即{4,-1,2,1}部分)。注意边界情况处理如所有元素都为负等特殊情况也已考虑进去因为初始化值取的是第一个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值