【练习】力扣 热题100 最大子数组和

题目

给你一个整数数组 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

来源:力扣 热题100 最大子数组和
——————————————————————

最大子数组和问题(Maximum Subarray Problem)是一个经典的算法问题,目标是在一个整数数组中找到具有最大和的连续子数组。以下是5种解法及其详细解释:


1. 暴力枚举法(数据量很大时,此题会超时)

思路
  • 枚举所有可能的子数组,计算每个子数组的和,并记录最大值。
  • 使用双重循环,外层循环确定子数组的起点,内层循环确定子数组的终点。
代码实现
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum = INT_MIN; //int最小值
        for (int i = 0; i < nums.size(); i++) {
            int sum = 0;
            for (int j = i; j < nums.size(); j++) {
                sum += nums[j];
                maxSum = max(maxSum, sum);
            }
        }
        return maxSum;
    }
};
时间复杂度
  • O(N^2),其中 N 是数组的长度。
  • 外层循环运行 N 次,内层循环平均运行 N/2 次。
空间复杂度
  • O(1),只使用了常数级别的额外空间。

2. 动态规划(Kadane 算法)(最优解)

思路
  1. 使用动态规划的思想,原地修改数组 nums,将 nums[i] 更新为以 nums[i] 结尾的最大子数组和。
  2. 如果 nums[i - 1] 大于 0,说明以 nums[i - 1] 结尾的子数组和对 nums[i] 有贡献,因此将其加到 nums[i] 上。
  3. 在遍历过程中,记录 nums[i] 的最大值,即全局最大子数组和。
代码实现
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum = nums[0]; // 全局最大子数组和

        // 动态规划:原地修改 nums[i] 为以 nums[i] 结尾的最大子数组和
        for (int i = 1; i < nums.size(); i++) {
            // 如果 nums[i - 1] 大于 0,则将其加到 nums[i] 上
            if (nums[i - 1] > 0) {
                nums[i] += nums[i - 1];
            }
            // 更新全局最大子数组和
            maxSum = max(maxSum, nums[i]);
        }

        return maxSum;
    }
};

你可能感兴趣的:(力扣,hot100,输入输出,动态规划,leetcode,算法,c++,开发语言)