当前位置: 首页 > news >正文

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.dtcms.com/a/344602.html

相关文章:

  • 数据工程师——ETL
  • 开发避坑指南(35):mybaits if标签test条件判断等号=解析异常解决方案
  • 【Protues仿真】基于AT89C52单片机的LCD液晶显示屏显示控制
  • 基于单片机的电子血压计设计方案
  • 亚信科技Java 150道面试题及参考答案(上)
  • DS 0 | 数据结构学习:前言
  • 使用隧道(Tunnel)连接PostgreSQL数据库(解决防火墙问题)
  • CentOS 10安装Ollama
  • Redis高级篇 | 分布式缓存四大核心问题讲解:持久化、主从集群、哨兵与分片集群
  • 【Java后端】【可直接落地的 Redis 分布式锁实现】
  • Python数据治理实战从爬虫到情感分析的电商评论处理系统
  • MySQL 高级主题:索引优化、ORM 与数据库迁移
  • java8 findAny()、findFirst()空指针NullPointerException问题
  • [RestGPT] RestGPT智能体
  • 从零开始的云计算生活——第四十九天,长路漫漫,kubernetes模块之持久化存储
  • 计算机网络技术-第七章
  • 嵌入式学习 day57 驱动-驱动框架
  • 利用 PHP 爬虫获取淘宝商品描述实战指南
  • 全志T113学习记录
  • 渲染新纪元:人工智能如何重构数字内容生产流水线
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘uvicorn’问题
  • EMNLP 2025数据公布,投稿量首次突破8000
  • 【AGI使用教程】GPT-OSS 本地部署(1)
  • Java StringBuilder 深度解析
  • c++的可扩展性方法
  • 20250822:从梦中云南到现实调试:海康球机 API 小故障排查
  • 以下是基于图论的归一化切割(Normalized Cut)图像分割工具的完整实现,结合Tkinter界面设计及Python代码示
  • 【数据结构C语言】顺序表
  • ZYNQ启动流程——ZYNQ学习笔记11
  • 线性回归学习