LeetCode100-53最大子数组和

本文基于各个大佬的文章

上点关注下点赞,明天一定更灿烂!


前言

        Python基础好像会了又好像没会,所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考,写给自己看的,也欢迎大家在评论区指导~

        您的每一条评论都会让我更有学习的动力。


一、分析题目

进入了新的一部分:数组

这个题目看要求的话思路应该挺简单的吖

二、思路以及代码

暴力选手的思路还是那么的返璞归真,一下就想到,枚举所有可能的子数组,计算每个子数组的和
然后比较得出最大和了,但是时间复杂度肯定会超,不写了不写了。

今天暂时放弃暴力写法 用一下上学期算法课学的分治法吧(其实是我就开学听了这一节课,只会个简单的分治法,动态规划,贪心,回溯什么的都不会)

首先复习一下分治法,法如其名,是采取”分而治之“策略的算法结构,

其核心思路是:

  1. 分(Divide):将原问题分解为若干个规模较小的子问题
  2. 治(Conquer):递归求解各个子问题
  3. 合(Combine):合并子问题的解,得到原问题的解

本题采用分治法的思路:

将数组分成左右两部分
递归求解左右部分的最大子数组和
求解跨越中点的最大子数组和
返回三者中的最大值

步骤1:分解数组

将数组nums[left...right]从中间mid分成左右两部分:

  • 左半部分:nums[left...mid]
  • 右半部分:nums[mid+1...right]

步骤2:递归求解子问题

递归计算:

  • 左半部分的最大子数组和(left_sum
  • 右半部分的最大子数组和(right_sum

步骤3:求解跨越中点的最大子数组和

这是分治法解决该问题的关键步骤,需要找到包含中点的最大子数组:

  1. 从中间向左扫描,找到以中点为终点的最大子数组和(left_cross_sum

  2. 从中间向右扫描,找到以中点为起点的最大子数组和(right_cross_sum

  3. 跨越中点的最大子数组和为两者之和(cross_sum = left_cross_sum + right_cross_sum

步骤4:合并结果

返回left_sumright_sumcross_sum中的最大值

class Solution:def maxSubArray(self, nums: List[int]) -> int:def max_crossing_sum(nums, left, mid, right):# 步骤1: 向左扫描,找到以mid为终点的最大子数组和left_sum = float('-inf')  # 初始化为负无穷大current_sum = 0# 从mid向左遍历到leftfor i in range(mid, left - 1, -1):current_sum += nums[i]# 更新最大和if current_sum > left_sum:left_sum = current_sum# 步骤2: 向右扫描,找到以mid+1为起点的最大子数组和right_sum = float('-inf')  # 初始化为负无穷大current_sum = 0# 从mid+1向右遍历到rightfor i in range(mid + 1, right + 1):current_sum += nums[i]# 更新最大和if current_sum > right_sum:right_sum = current_sum# 步骤3: 返回左右两部分的和(跨越中点的最大子数组和)return left_sum + right_sumdef max_subarray(nums, left, right):"""递归计算最大子数组和nums: 数组left: 左边界right: 右边界"""# 基本情况:数组只有一个元素if left == right:return nums[left]# 步骤1: 分解 - 找到中点mid = (left + right) // 2# 步骤2: 治 - 递归求解左右两部分left_sum = max_subarray(nums, left, mid)       # 左半部分的最大子数组和right_sum = max_subarray(nums, mid + 1, right) # 右半部分的最大子数组和# 步骤3: 合 - 计算跨越中点的最大子数组和cross_sum = max_crossing_sum(nums, left, mid, right)# 返回三者中的最大值return max(left_sum, right_sum, cross_sum)# 初始调用return max_subarray(nums, 0, len(nums) - 1)

成功运行,但是速度较慢,因为分治法其实是比较笨的办法

我们看一下官方题解用的办法,53. 最大子数组和 - 力扣(LeetCode)

官方用的动态规划,这个我还不会,明天再学吧。我要去追电视剧了。

三、本题收获

明天一定学,学完再回来编辑。


总结

        只会打暴力,基础一团糟,明天再学吧老铁,别真学会了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

当我们想用GPU(nlp模型篇)

在个人设备上“把 GPU 真正用起来”做 NLP,分五步:准备 → 安装 → 验证 → 训练/推理 → 踩坑排查。下面每一步都给出可复制命令和常见错误。 ────────────────── 1. 硬件准备 • 一张 NVIDIA GPU,算力 ≥ 6.1&#xff08…

celery

celery是什么celery是Python开发的简单的、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时支持任务调度celery本身不含消息服务,它使用第三方消息服务来传递任务,支持的消息服务有RabbitMQ、Redis、Amazon SQS,celery本…

MeterSphere接口自动化多场景批量运行复制引用

一、场景批量执行 全选,点击任意对号后面的三个冒号图标,可以看到批量处理(批量执行、批量编辑、批量移动、批量复制等)批量编辑,可以对用例等级,状态,责任人,运行环境、标签更改 选择批量更改标签&#xf…

Flutter 小技巧之有趣的 UI 骨架屏框架 skeletonizer

很久没有更新过小技巧系列,今天简单介绍一个非常好用的骨架屏框架 skeletonizer ,它主要是通过将你现有的布局自动简化为简单的骨架,并添加动画效果来实现加载过程,而使用成本则是简单的添加一个 Skeletonizer 作为 parent &…

RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设

【RabbitMQ面试精讲 Day 26】RabbitMQ监控体系建设 在“RabbitMQ面试精讲”系列的第26天,我们将聚焦于RabbitMQ监控体系建设这一关键运维主题。作为消息中间件的核心组件,RabbitMQ一旦出现消息积压、节点宕机或资源耗尽等问题,将直接影响系统…

强化学习中的重要性采样:跨分布复用样本的核心技术

在强化学习中,智能体需与环境交互采集样本(轨迹、状态 - 动作对)以更新策略。但 “样本分布必须与目标策略分布一致” 的同策略限制,会导致采样效率低下(每次策略更新都需重新采样)。此时,** 重…

SWMM排水管网水力、水质建模及海绵城市与水环境中的应用

一:SWMM软件及水力建模基础 1.1软件模块结构 1.2建模基础数据的分类及获取方法概述 1.3软件基本功能介绍 1.4 SWMM相较于其他商业软件的优缺点二:管网水质建模基础 2.1数据需求分析 各种SWMM对象的数据需求以及含义 2.2基础数据整理 2.3基础数据的输入 各…

MySQL 50 道经典练习题及答案

目录 一、数据表设计与初始化 1. 数据表结构说明 2. 建表语句 3. 插入测试数据 二、练习题及答案 1. 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数 2. 查询同时存在 "01" 课程和 "02" 课程的情况 3. 查询存在 &qu…

MyCAT分库分表

MyCAT分库分表 前言: 很难评价的软件 尝试通过修改配置文件做到分库分表 你会发现一些很离谱的BUG 或者是主从分离的时候 你也会发现 莫名其妙的BUG ‍ 创建基础环境192.168.3.145192.168.3.159192.168.3.163MyCAT MySQLMySQLMySQL --更改root密码alter user rootlo…

C++开发/Qt开发:单例模式介绍与应用

单例模式是软件设计模式中最简单也是最常用的一种创建型设计模式。它的核心目标是确保一个类在整个应用程序生命周期中只有一个实例,并提供一个全局访问点。笔者白话版理解:你创建了一个类,如果你希望这个类对象在工程中应用时只创建一次&…

学习设计模式《二十三》——桥接模式

一、基础概念 桥接模式的本质是【分离抽象和实现】。 桥接模式的定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 认识桥接模式序号认识桥接模式说明1什么是桥接通俗点说就是在不同的东西之间搭一个桥,让它们能够连接起来&a…

HTML+CSS:浮动详解

在HTMLCSS布局中,浮动(float) 是一种经典的布局技术,用于控制元素在页面中的排列方式。它最初设计用于实现文字环绕图片的效果,后来被广泛用于复杂布局,但随着Flexbox和Grid的兴起,其使用场景有…