LeetCode 算法:最大子数组和c++

news2024/11/26 14:38:00

原题链接🔗:最大子数组和
难度:中等⭐️⭐️

题目

给你一个整数数组 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. 题解:Kadane 算法。
  2. 复杂度:时间复杂度为 O(n),空间复杂度为 O(1)
  3. 代码过程
  • 初始化变量
    • currentMax:当前子数组的最大和,初始值为数组的第一个元素。
    • globalMax:全局最大子数组和,初始值同 currentMax。
  • 遍历数组: 从数组的第二个元素开始遍历(如果数组不为空)。
  • 更新当前最大和:对于数组中的每个元素 nums[i],决定是将其加到当前子数组的末尾,还是从这个元素开始一个新的子数组。这可以通过比较 nums[i] 和 currentMax + nums[i] 来实现,取两者中的较大值作为新的 currentMax。
  • 更新全局最大和:在每次迭代中,比较 currentMax 和 globalMax,将较大的值赋给 globalMax。
  • 返回结果:遍历完成后,globalMax 将包含整个数组的最大子数组和。
  1. c++ demo:
#include <iostream>
#include <vector>
#include <algorithm> // 用于 std::max 函数

// 函数返回最大子数组和
int maxSubArraySum(const std::vector<int>& nums) {
    if (nums.empty()) return 0;

    int currentMax = nums[0];
    int globalMax = nums[0];

    for (int i = 1; i < nums.size(); ++i) {
        // 选择当前元素自身或者加上之前的currentMax
        currentMax = std::max(nums[i], currentMax + nums[i]);
        // 更新全局最大值
        globalMax = std::max(globalMax, currentMax);
    }

    return globalMax;
}

// 主函数
int main() {
    // 测试用例
    std::vector<int> testArray = { -2,1,-3,4,-1,2,1,-5,4 };

    // 调用函数并打印结果
    int maxSum = maxSubArraySum(testArray);
    std::cout << "Maximum subarray sum is: " << maxSum << std::endl; // 应该输出 6,因为 [4,-1,2,1] 是最大子数组

    // 可以添加更多的测试用例来验证算法的正确性
    std::vector<int> testArray2 = { 1 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray2) << std::endl; // 应该输出 1

    std::vector<int> testArray3 = { 5,4,-1,7,8 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray3) << std::endl; // 应该输出 23

    std::vector<int> testArray4 = { -8 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray4) << std::endl; // 应该输出 -8

    std::vector<int> testArray5 = { -2, -3, 4, -1, -2, 1, 5, -3 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray5) << std::endl; // 应该输出 7

    return 0;
}
  • 运行结果:

Maximum subarray sum is: 6
Maximum subarray sum is: 1
Maximum subarray sum is: 23
Maximum subarray sum is: -8
Maximum subarray sum is: 7
在这里插入图片描述

Kadane 算法

Kadane
算法是一种用于解决最大子数组和问题的有效算法。最大子数组和问题是指在给定的整数数组中找到一个连续子数组,使得该子数组的和最大。Kadane
算法通过动态规划的思想来解决这个问题,其核心思想是利用当前子数组的和来帮助确定后续子数组的最大和。

Kadane 算法的步骤:

  1. 初始化:设置两个变量 currentMaxglobalMax 来分别存储当前子数组的最大和以及全局最大和。初始时,这两个变量都设为数组的第一个元素。

  2. 遍历数组:从数组的第二个元素开始遍历。

  3. 更新当前最大和:对于当前遍历到的元素 nums[i],决定是将其加到当前子数组的和中,还是从当前元素开始一个新的子数组。这可以通过比较 nums[i]
    currentMax + nums[i] 的大小来实现。如果 nums[i] 本身就大于 currentMax + nums[i],说明当前子数组加上这个元素后的和会减小,因此应该从 nums[i] 开始一个新的子数组。

    更新公式为: [ \text{currentMax} = \max(\text{nums}[i],
    \text{currentMax} + \text{nums}[i]) ]

  4. 更新全局最大和:每次更新完 currentMax 后,比较 currentMaxglobalMax 的大小,并更新 globalMax

  5. 返回结果:遍历完成后,globalMax 将包含整个数组的最大子数组和。

Kadane 算法的特点:

  • 时间复杂度:O(n),其中 n 是数组的长度,因为算法只遍历一次数组。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

Kadane 算法简洁且效率高,是解决最大子数组和问题的首选方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1805583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

28-LINUX--I/O复用-epoll

一.epoll概述 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、poll 有很大差异。首 先&#xff0c;epoll 使用一组函数来完成任务&#xff0c;而不是单个函数。其次&#xff0c;epoll 把用户关心的文件描述 符上的事件放在内核里的一个事件表中。从而无需像…

计算机组成原理之指令格式

1、指令的定义 零地址指令&#xff1a; 1、不需要操作数&#xff0c;如空操作、停机、关中断等指令。 2、堆栈计算机&#xff0c;两个操作数隐藏在栈顶和此栈顶&#xff0c;取两个操作数&#xff0c;并运算的结果后重新压回栈顶。 一地址指令&#xff1a; 二、三地址指令 四…

C# WPF入门学习主线篇(十六)—— Grid布局容器

C# WPF入门学习主线篇&#xff08;十六&#xff09;—— Grid布局容器 欢迎来到C# WPF入门学习系列的第十六篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel 和 DockPanel 布局容器及其使用方法。本篇博客将介绍另一种功能强大且灵活的布局容器—…

Spring AI 第二讲 之 Chat Model API 第四节Amazon Bedrock

Amazon Bedrock是一项托管服务&#xff0c;通过统一的应用程序接口提供来自不同人工智能提供商的基础模型。 Spring AI 通过实现 Spring 接口 ChatModel、StreamingChatModel 和 EmbeddingModel&#xff0c;支持亚马逊 Bedrock 提供的所有聊天和嵌入式 AI 模型。 此外&#xf…

【Python报错】已解决TypeError: ufunc ‘isnan’ not supported for the input types

成功解决“TypeError: ufunc ‘isnan’ not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ‘‘safe’’”错误的全面指南 在使用NumPy等科学计算库时&#xff0c;我们经常会遇到各种各样…

pytorch-数据增强

目录 1. Flip翻转2. Rotate旋转3. scale缩放4. crop裁剪5. 总结6. 完整代码 1. Flip翻转 上图中做了随机水平翻转和随机垂直翻转&#xff0c;翻转完成后转化成tensor 2. Rotate旋转 上图中作了2次旋转第一次旋转角度在-15<0<15范围内&#xff0c;随机出一个角度&#xf…

创建google cloud storage notification 的权限问题

问题 根据google 的文档&#xff1a; https://cloud.google.com/storage/docs/reporting-changes#command-line 明确表示&#xff0c; 要创建storage notificaiton &#xff0c; 创建者(or service account) 只需要bucket 和 pubsub admin roles 但是实际上我在公司尝试为1个…

【AI 高效问答系统】机器阅读理解实战内容

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

【spark】spark列转行操作(json格式)

前言&#xff1a;一般我们列转行都是使用concat_ws函数或者concat函数&#xff0c;但是concat一般都是用于字符串的拼接&#xff0c;后续处理数据时并不方便。 需求&#xff1a;将两列数据按照设备id进行分组&#xff0c;每个设备有多个时间点位和对应值&#xff0c;将其一一对…

企业网页制作

随着互联网的普及&#xff0c;企业网站已成为企业展示自己形象、吸引潜在客户、开拓新市场的重要方式。而企业网页制作则是构建企业网站的基础工作&#xff0c;它的质量和效率对于企业网站的成败至关重要。 首先&#xff0c;企业网页制作需要根据企业的特点和需求进行规划。在网…

Springboot使用webupload大文件分片上传(包含前后端源码)

Springboot使用webupload大文件分片上传&#xff08;包含源码&#xff09; 1. 实现效果1.1 分片上传效果图1.2 分片上传技术介绍 2. 分片上传前端实现2.1 什么是WebUploader&#xff1f;功能特点接口说明事件APIHook 机制 2.2 前端代码实现2.2.1&#xff08;不推荐&#xff09;…

ssm汽车在线销售系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

python中使用 Matplotlib 的 GridSpec 来实现更复杂的布局控制

matplotlib.gridspec 是 Matplotlib 库中的一个模块&#xff0c;用于创建复杂的子图布局。GridSpec 提供了更精细的控制&#xff0c;允许你定义不同大小和位置的子图。下面是对 GridSpec 的详细介绍和一些常见用法示例&#xff1a; 1. 基本用法 GridSpec 类似于表格布局&…

R语言数据分析16-针对芬兰污染指数的分析与考察

1. 研究背景及意义 近年来&#xff0c;随着我国科技和经济高速发展&#xff0c;人们生活质量也随之显著提高。但是&#xff0c; 环境污染问题也日趋严重&#xff0c;给人们的生活质量和社会生产的各个方面都造成了许多不 利的影响。空气污染作为环境污染主要方面&#xff0c;更…

FCN-语义分割中的全卷积网络

FCN-语义分割中的全卷积网络 语义分割 语义分割是计算机视觉中的关键任务之一&#xff0c;现实中&#xff0c;越来越多的应用场景需要从影像中推理出相关的知识或语义&#xff08;即由具体到抽象的过程&#xff09;。作为计算机视觉的核心问题&#xff0c;语义分割对于场景理…

QT C++(QT控件 QPushButton,QRadioButton,QCheckBox)

文章目录 1. QPushButton 普通按钮2. QRadioButton 单选按钮3. QCheckBox 复选按钮 1. QPushButton 普通按钮 QPushButton中的重要属性 text&#xff1a;按钮中的文本icon&#xff1a;按钮的图标iconSize&#xff1a;按钮中图标的尺寸shortCut&#xff1a;按钮对应的快捷键&a…

关于烫烫烫和屯屯屯

微较的msvc编译器&#xff0c;调试模式下为了方便检测内存的非法访问&#xff0c;对于不同的内存做了初始化&#xff0c; 未初始化栈&#xff1a; 0xCCCCCCCC 未初始化堆&#xff1a; 0xCDCDCDCD 已释放的堆&#xff1a; 0xDDDDDDDD 0xCCCC解释为GB2312字符即是烫&#xff…

“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“

前言&#xff1a;在Java编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;与浅拷贝&#xff08;Shallow Copy&#xff09;是两个非常重要的概念。它们涉及到对象在内存中的复制方式&#xff0c;对于理解对象的引用、内存管理以及数据安全都至关重要。 ✨✨✨这里是秋…

AI视频教程下载:如何用ChatGPT来求职找工作?

这是一个关于使用ChatGPT找工作的课程&#xff0c;作者分享了自己的求职经验和技巧&#xff0c;介绍了如何使用人工智能来改进个人资料和简历&#xff0c;以及如何研究公司和面试。通过细节处理职业目标、分享个人兴趣和技能、寻求导师和专业发展机会&#xff0c;以及在行业内建…

【K8s源码分析(三)】-K8s调度器调度周期介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 本次分析参考的K8s版本是v1.27.0。 K8s的整体调度框架如下图所示。 调度框架顶层函数 K8s调度器调度的核心函数schedulerone在pkg/scheduler/schedule_one.go:62&#xff0c;如下&#xff0c;这里将一些解释写在了注…