Leetcode:Maximum Subarray

本文探讨了最大子数组和问题的解决方法,介绍了Kadane算法的基本思想,并给出了具体的实现代码。通过分析不同情况下的最优解,展示了如何利用一次遍历达到高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Question:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum. 
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6. 
最大子数组和问题

虽然在LeetCode上显示的难度是easy,但事实上本题并不简单,即找到一个连续的子数组并且满足该数组的所有数之和是数组所有子数组中最大的,函数返回该最大值。
解法:

  1. 首先我们要先注意的是contiguous,指的是连续的序列,对于一个素数为n的数组,其含有 2n 个子序列和n(n+1)/2个连续的子序列。因此最容易想到的方法就是穷举法,但至少要O( n2 )的时间复杂度,显然不是一个好的算法。
  2. 先进行分析,若数组中所有数为负数时,最大值应该为一个最大的负数;其他情况的最大值必然是一个正数,因此若当和小于0时,必然要重新组合成下一个子序列。另外还要注意的是vector的函数用法。
  3. 算法描述:
    (1)遍历该数组, 在遍历过程中, 将遍历到的元素依次累加起来, 当累加结果小于0时, 从下一个元素开始,重新开始累加。
    (2)累加过程中, 要用一个变量max记录所获得过的最大值
    (3)一次遍历之后, 变量 max中存储的即为最大子片段的和值

  4. 代码如下

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum = 0;
        int max = 0x80000001;//将max设为最小值
        int n = 0;
        while(n < nums.size()) {
            sum += nums[n];
            if (max < sum) max = sum;
            if (sum < 0) sum = 0;
            n++;
        }
        return max;
    }
};

总结与其他算法

查阅资料后发现该题涉及一个算法思想Kadane算法

该问题最初由布朗大学的Ulf Grenander教授于1977年提出,当初他为了展示数字图像中一个简单的最大似然估计模型。不久之后卡内基梅隆大学的Jay Kadane提出了该问题的线性算法:Kadane算法扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大和(正数和)。该子数列由两部分组成:以前一个位置为结束点的最大子数列、该位置的数值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值