每日一题:最大子数组和

62 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

题目链接

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

子数组是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104  

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

解题思路:暴力法

需要注意的是,题目找出一个具有最大和的连续子数组这句话中的连续这个关键词,说明不是让我们找子序列,每个数之间必须相连

具体思路

  1. 用一个嵌套遍历查找
  2. 第一个外循环的初始值定义为最开始的地方
  3. 每次和第二个循环里的值相加,并与当前的最大值进行比较
  4. 将最新的最大值赋值给它
  5. 寻找所有可能出现的子序和找到最大值

代码实现 (C++)

class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        int max = INT_MIN;
        int numsSize = int(nums.size());
        for (int i = 0; i < numsSize; i++)
        {
            int sum = 0;
            for (int j = i; j < numsSize; j++)
            {
                sum += nums[j];
                if (sum > max)
                {
                    max = sum;
                }
            }
        }

        return max;
    }
};

复杂度分析

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

动态规划