天天看点

力扣-53 最大子序和题目描述示例方法一:暴力解法方法二:动态规划

题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例

输入: [-2,1,-3,4,-1,2,1,-5,4]

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

方法一:暴力解法

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        int max=INT_MIN; // int范围内的最小值
        for(int i=0;i<n;i++)
        {
            sum=0;
            for(int j=i;j>=0;j--)
            {
                sum+=nums[j];
                if(sum>max) max=sum;
            }
        }
        return max;
    }
};
           

复杂度分析:

  • 时间复杂度:O(n^2),两个for循环,时间复杂度较高,
  • 空间复杂度:O(1),只用到了常数变量存放数据。

方法二:动态规划

思路:用 f(i)代表以第 i个数结尾的「连续子数组的最大和」,故我们不难得到状态转移方程:f[i]=max(f[i-1]+nums[i],nums[i]);最后我们只需求出f数组中的最大值即可。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> f(n);
        int max_num=nums[0];
        f[0]=nums[0];
        for(int i=1;i<n;i++)
        {
            f[i]=max(f[i-1]+nums[i],nums[i]);
            max_num=max(max_num,f[i]);
        }
        return max_num;
    }
};
           

复杂度分析:

  • 时间复杂度:O(n),只用了一次循环遍历数组,
  • 空间复杂度:O(n),创建了一个新的动态数组存放数据。
    力扣-53 最大子序和题目描述示例方法一:暴力解法方法二:动态规划