LeetCode 0053. Maximum Subarray【DP,最大子序和】

本文深入探讨了寻找最大子数组和的算法实现,包括贪心算法和分治法。通过实例讲解了如何在O(N)的时间复杂度下找到具有最大和的连续子数组,并提供了详细的代码示例。

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

思路1

  1. 使用贪心的方法,每一步选择最佳方案,最后得到全局最优
  2. 在每个步骤中更新
    1. 当前元素
    2. 当前元素位置的最大和
    3. 迄今为止的最大和

时间复杂度 O(N)O(N)O(N) 空间复杂度 O(1)O(1)O(1)

在这里插入图片描述

代码1

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int max_sum = nums[0], cur_sum = nums[0];
        for(int i = 1; i < nums.size(); i++)
        {
            cur_sum = max(cur_sum + nums[i], nums[i]); // 当前最大和
            max_sum = max(max_sum, cur_sum);  // 历史最大和
        }
        return max_sum;
    }
};

思路2

首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 max_sum
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字。如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字。每次比较 summax_sum 的大小,将最大值置为 max_sum,遍历结束返回结果。实际处理过程中可以使用滚动数组来存储值。

时间复杂度 O(N)O(N)O(N) 空间复杂度 O(1)O(1)O(1)

代码2

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size(), max_sum = nums[0];
        for(int i = 1; i < len; i++)
        {
            if(nums[i-1] > 0)
                nums[i] += nums[i-1] ;
            max_sum = max(max_sum, nums[i]);
        }
        return max_sum;
    }
};
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = nums[0], sum = 0;
        for(const auto &it : nums)
        {
            if(sum > 0)
                sum += it;
            else
                sum = it;
            ans = max(sum, ans);
        }
        return ans;
    }
};

在线处理

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res =-0x7fffffff, temp = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            temp += nums[i];
            if(temp > res)  res = temp;
            if(temp < 0)  temp = 0;
        }
        return res;
    }
};

思路3

分治法

代码3


内容概要:本文围绕“基于改进滑模控制的永磁同步电机调速系统模型研究”展开,重点介绍在Simulink环境中构建仿真永磁同步电机(PMSM)调速系统的方法,采用改进滑模控制策略以提升系统鲁棒性与动态性能。文中系统阐述了控制算法的设计原理、系统建模流程、关键模块搭建及仿真结果分析,旨在复现高水平科研成果(SCI/EI级别),并通过仿真实验验证所提控制策略的有效性。该研究属于电机控制与电力电领域的前沿方向,对高精度伺服系统、新能源汽车电驱动系统等实际应用场景具有重要的理论指导工程参考价值; 适合人群:具备自动控制理论基础Simulink/MATLAB仿真能力,从事电气工程、自动化、电力电等相关专业的研究生、科研人员及工程技术人员,尤其适合致力于复现高水平学术论文成果的研究者; 使用场景及目标:①深入学习永磁同步电机矢量控制与滑模变结构控制的核心原理与建模方法;②复现并理解SCI/EI期刊中先进电机控制算法的技术细节;③开展电机控制系统仿真研究,优化控制参数,提升系统抗干扰能力、稳态精度与动态响应性能; 阅读建议:建议结合文中提及的完整资源包(含Simulink模型、MATLAB代码、详细说明文档)进行实践操作,重点关注控制策略的实现逻辑与仿真调试过程,注重理论推导与仿真实验相结合,同时参考同类高水平研究以拓展技术视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值