LeetCode53. Maximum Subarray(easy)

本文探讨了LeetCode上经典的最大子数组和问题,提出了两种解决方案。一种是通过记录左侧和右侧子数组的最小和来寻找最大子数组,但由于采用了嵌套循环导致时间复杂度较高。第二种方法更简洁高效,通过迭代数组并维护一个最大值变量,当遇到负数时重新开始累加,从而找到最大子数组的和。

原题地址:https://leetcode.com/problems/maximum-subarray/description/


题目:
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.


题解:
写这道题比较艰难。比较容易看出的解题思路就是通过判断当前累加的值决定最大子数组范围。比如,当前累加的值sum小于0时,就意味着可以把之前所有累加的值舍弃,并指向下一个元素。但我一直在思考如何同时确定两边的范围而不冲突,这就导致我陷入了一个死胡同,为此还花相当多的时间写了一个计算两边累加之和最小,然后再用总的和减去这个数的程序,但因为用到了嵌套循环,这个程序时间复杂度非常糟糕。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int size = nums.size(), count = 0, maxNum = 0, sum = 0;
        for (int i = 0; i < size; i++) {
            sum += nums[i];
            if (nums[i] < 0) count++;
        }
        if (count == size) {            
            maxNum = nums[0];
            for (int i = 1; i < size; i++)
                if (nums[i] > maxNum) maxNum = nums[i];
            return maxNum;
        }
        else if (count == 0) {              
            return sum;
        }
        map<int, int> sumls, sumrs;
        sumls.insert(make_pair(-1, 0));
        sumrs.insert(make_pair(size, 0));
        vector<int> sums;
        int suml = 0, sumr = 0;
        for (int i = 0, j = size-1; i < size, j >= 0; i++, j--) {
            suml += nums[i];
            if (suml < 0) sumls.insert(make_pair(i, suml));
            sumr += nums[j];
            if (sumr < 0) sumrs.insert(make_pair(j, sumr));
        }
        int minNum = 0;
        for (map<int, int>::iterator i = sumls.begin(); i != sumls.end(); i++) {
            map<int, int>::iterator j;
            if (sumrs.find(i->first + 1) == sumrs.end())
                j = sumrs.begin();
            else
                j = sumrs.find(i->first + 1);
            for (; j != sumrs.end(); j++) {
                if (i->first < j->first&&i->second + j->second < minNum) minNum = i->second + j->second;
            }
        }
        maxNum = sum - minNum;
        return maxNum;
    }
};

后来看了其他人的代码后发现,之前的思路是没有问题的,但是问题我无法确定另一侧的边界。因为在sum加上一个负数之后但是其值仍然大于0后,程序仍然会继续运行,但是这就不会是最大值,也无法确定之后是否sum会变得更大,因此我认为应该同时确定两个边界。事实上是我把问题想复杂化了,只需要使用一个变量,保存当前最大值,每次把新的sum和它做比较,再确定是否替换。这样就可以确保在所有区域中,能够选取和最大的一个。


新的代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxNumber = INT_MIN, sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (sum > 0) {
                sum += nums[i];
            } else {
                sum = nums[i];
            }
            maxNumber = max(sum, maxNumber);
        }
        return maxNumber;
    }
};
【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
### 如何在 VSCode 中安装和配置 LeetCode 插件以及 Node.js 运行环境 #### 安装 LeetCode 插件 在 VSCode 的扩展市场中搜索 `leetcode`,找到官方提供的插件并点击 **Install** 按钮进行安装[^1]。如果已经安装过该插件,则无需重复操作。 #### 下载与安装 Node.js 由于 LeetCode 插件依赖于 Node.js 环境,因此需要下载并安装 Node.js。访问官方网站 https://nodejs.org/en/ 并选择适合当前系统的版本(推荐使用 LTS 版本)。按照向导完成安装流程后,需确认 Node.js 是否成功安装到系统环境中[^2]。 可以通过命令行运行以下代码来验证: ```bash node -v npm -v ``` 上述命令应返回对应的 Node.js 和 npm 的版本号。如果没有正常返回版本信息,则可能未正确配置环境变量。 #### 解决环境路径问题 即使完成了 Node.js 的安装,仍可能出现类似 “LeetCode extension needs Node.js installed in environment path” 或者 “command ‘leetcode.toggleLeetCodeCn’ not found” 的错误提示[^3]。这通常是因为 VSCode 未能识别全局的 Node.js 路径或者本地安装的 nvm 默认版本未被正确加载[^4]。 解决方法如下: 1. 手动指定 Node.js 可执行文件的位置 在 VSCode 设置界面中输入关键词 `leetcode`,定位至选项 **Node Path**,将其值设为实际的 Node.js 安装目录下的 `node.exe` 文件位置。例如:`C:\Program Files\nodejs\node.exe`。 2. 使用 NVM 用户管理工具调整默认版本 如果通过 nvm 工具切换了不同的 Node.js 版本,请确保设置了默认使用的版本号。可通过以下指令实现: ```bash nvm alias default <version> ``` 重新启动 VSCode 后测试功能键是否恢复正常工作状态。 --- #### 配置常用刷题语言 最后一步是在 VSCode 设置面板中的 LeetCode 插件部分定义个人习惯采用的主要编程语言作为默认提交方式之一。这样可以减少频繁修改编码风格的时间成本。 --- ### 总结 综上所述,要在 VSCode 上顺利启用 LeetCode 插件及其关联服务,除了基本插件本身外还需额外准备支持性的后台框架——即 Node.js 应用程序引擎;同时针对特定场景下产生的兼容性障碍采取针对性措施加以修正即可达成目标[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值