04-26 每日一题 1031. 两个非重叠子数组的最大和 学习反思

news2024/12/24 20:17:02

1031. 两个非重叠子数组的最大和

类似问题转换

  1. 考虑一个问题,如何求得数组中两个数的最大和。
    1. 可以固定一个数,然后向右遍历
    2. 如下,可以求得目标数组中两个数的最大和为 15

image.png

把思路实现为代码

  1. 实现过程,如上图所示过程,右指针在移动过程中是跟随数组下标的
  2. 左边部分的元素需要维护一个最大值,所以需要一个变量,保存左边元素的最大值
  3. 需要求得最大和,所以需要一个变量保存最终结果
  4. 最后一次遍历即可
def two_sum_max(nums: List[int]) -> int:
    ans, left = 0, 0
    for i in range(1, len(nums)):
        left = max(left, nums[i-1])
        ans = max(ans, left + nums[i])
    return ans

回到本题

  1. 扩展数字到区间,求数组内两个不重叠的连续区间的和的最大值
  2. 可以使用同样的思路,如下图

image.png

思路实现为代码

  1. 首先最终返回一个最大值,需要一个变量保存最终结果
  2. 遍历过程中可以计算右边部分的区间和
    1. 涉及到区间和需要联想到数组前缀和
    2. 所以需要实现求得数组的前缀和
  3. 需要一个变量,在遍历过程中维护左边部分的最大值
    1. 最终结果=左边部分最大值+右边部分区间和
    2. 在遍历过程中不断比较得到最终结果
  4. 需要注意在遍历过程中求前缀和的时候的下标计算控制
def max_two_gap_of_nums(nums: List[int], first_len: int, second_len: int) -> int:
    n = len(nums)
    for i in range(1, n):
        nums[i] = nums[i - 1] + nums[i]
    ans, left_max = 0, 0
    # 给 右边区间留足空间  遍历到  n - second_len
    # 区间 second_len 在后
    for i in range(first_len, n - second_len + 1):
        # 维护左边窗口的最大值的和
        # i 从 first_len 开始遍历,所要求的区间和位于  first_len 前面
        # 所以 有  nums[i - 1] - nums[i - first_len - 1]
        # 又因为 i - first_len - 1 有可能小于0,所以需要额外判断
        left_max = max(left_max, nums[i - 1] - (0 if (i - first_len - 1 < 0) else nums[i - first_len - 1]))
        # 左区间最大值 + 右边区间的最大值
        ans = max(ans, left_max + nums[i + second_len - 1] - nums[i - 1])
    # 区间 first_len 在后
    left_max = 0
    for i in range(second_len, n - first_len + 1):
        left_max = max(left_max, nums[i - 1] - (0 if (i - second_len - 1 < 0) else nums[i - second_len - 1]))
        ans = max(ans, left_max + nums[i + first_len - 1] - nums[i - 1])
    return ans
  1. 优化
    1. 可以把 两个区间 依次排列在后面优化成一个方法
def better(nums: List[int], first_len: int, second_len: int) -> int:
    n = len(nums)
    for i in range(1, n):
        nums[i] = nums[i - 1] + nums[i]
    return max(two_gap_sum(nums, first_len, second_len), two_gap_sum(nums, second_len, first_len))


def two_gap_sum(nums: List[int], a: int, b: int) -> int:
    res, t = 0, 0
    for i in range(a, len(nums) - b + 1):
        t = max(t, nums[i-1] - (0 if (i - a - 1 < 0) else nums[i - a - 1]))
        res = max(res, t + nums[i + b - 1] - nums[i - 1])
    return res

极其优雅的一次遍历

  1. 上述思路都是分情况遍历数组两次
  2. 实现思路的核心思想是固定一个窗口,然后求另一个窗口的最大值。然后再固定另一个窗口,进行两次遍历求得最终结果
  3. 实际上该过程可以在一次遍历中搞定,如下图

image.png

def best_way(nums: List[int], a: int, b: int) -> int:
    n = len(nums)
    for i in range(1, n):
        nums[i] = nums[i] + nums[i - 1]
    res, left_max, right_max = nums[a + b - 1], nums[a - 1], nums[b - 1]
    for i in range(a+b, n):
        left_max = max(left_max, nums[i - b] - nums[i - a - b])
        right_max = max(right_max, nums[i - a] - nums[i - a - b])
        res = max(res, max(left_max + nums[i] - nums[i - b], right_max + nums[i] - nums[i - a]))
    return res

心得感悟

  1. 通过学习 **lee **神的算法学习分享,要注重以下几点
    1. 切忌不要以做很多很多题为目标
    2. 培养对算法的兴趣
    3. 坚持写题解
    4. 不要怕浪费时间,万丈高楼平地起,坚持就好

参考

https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/solution/python3javacgotypescript-yi-ti-yi-jie-qi-7nqt/
https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/solution/ying-wen-ban-shang-pai-ming-di-yi-de-fei-chang-jin/
https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/solution/qian-zhui-he-bian-li-onshi-jian-fu-za-du-ji-ke-qiu/

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

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

相关文章

【汽车品牌案例02-设置右侧索引 Objective-C语言】

一、刚才我们说了一下,如何把那个汽车品牌加载起来,我们使用了一个模型的嵌套,以及我们在创建单元格的时候,是不是指定了一个,单元格的可重用ID吧, 1.根据重用ID来创建单元格,那么我们运行的时候,已经能把这个大致的效果做出来了, 大致就是这么一个效果, 接下来,还…

SPI机制源码解析

概念 SPI&#xff08;service provider interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制。是一种动态替换发现机制&#xff0c;比如有个接口&#xff0c;想在运行时动态地给它添件实现&#xff0c;只需要添加一个实现。 然后在META-INF/services目录创建一…

树莓派+摄像头:mjpg-streamer实现监控功能的配置及调试

目录 一 树莓派摄像头安装 二 配置mjpg-streamer ① 说明 ② 配置 <1> 配置前需要安装的工具包 <2> 下载安装mjpg-streamer源码到树莓 <3> 进入下载目录的路径 <4> 输入指令编译&#xff1a;make all <5> 安装指令&#xff1a;…

任务调度原理 通俗详解(FreeRTOS)

寄存器说明 以cortex-M3&#xff0c;首先先要了解比较特别的几个寄存器&#xff1a; r15 PC程序计数器&#xff08;Program Counter&#xff09;,存储下一条要执行的指令的地址。 r14 LR连接寄存器&#xff08;Link Register &#xff09;&#xff0c;保存函数返回地址&#x…

【操作系统】第一章

文章目录 &#x1f337; 一、操作系统的概念1、定义2、功能 和 目标 &#x1f337; 二、操作系统的特征1、**并发**2、 **共享**3、 **虚拟**4、 **不确定性** &#x1f337; 三、操作系统的发展与分类1、 手工操作阶段2、 批处理阶段3、 分时操作系统4、 实时操作系统5、 网络…

servlet技术

功能 对客户端发送的数据进行读取和拦截读取客户端请求的隐含数据运行结果或者生成结果发送响应的数据 Servlet技术特点 高效率 Servlet本身就是一个Java类&#xff0c;在运行的时候位于同一个Java虚拟机中&#xff0c;可以快速地响应客户 端的请求并生成结果。在Wb服务器…

停用词(stop words)+TF-IDF实现

一、什么是停用词&#xff1f; 在汉语中&#xff0c;有一类没有实际意义的词语&#xff0c;比如组词“的”&#xff0c;连词“以及”&#xff0c;副词“甚至”&#xff0c;语气词“吧”&#xff0c;被称为停用词。一个句子去掉这些停用词&#xff0c;并不影响理解。所以&#…

资产管理系统

目录 1、资产管理模块 资产入库 ​编辑 闲置资产分配 资产调配 资产回收 资产报废 车辆维修 2、资产设置模块 资产标准规格 资产分类 3、资产报表模块 全部资产报表 已分配资产报表 资产分类报表 到期资产报表 机构资产报表 资产折旧报表 机构分类报表 资产…

〖ChatGPT实践指南 - 零基础扫盲篇⑤〗- OpenAI API 演示 Demo 之宠物名字生成器

文章目录 ⭐ 运行 Demo应用 - 宠物名字生成器&#x1f31f; 安装 - node.js&#x1f31f; 利用 git 下载 Demo应用 - 宠物名字成器&#x1f31f; 添加 API 秘钥&#x1f31f; 安装依赖并运行Demo应用 - 宠物名字成器 ⭐ 访问并测试 Demo应用 - 宠物名字成器 在上一章节&#xf…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明&#xff0c;按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本&#xff0c;默认安装的版本都比较高。 中文文档没有说明&#xff0c;英文文档是有提到的&#xff1a; &#xff08;我在GitHub上找…

PostgreSQL-布尔类型

布尔类型 boolean的值要么是true&#xff0c;要么是false&#xff0c;如果是unknown状态&#xff0c;用NULL表示。 boolean在SQL中可以用不带引号的TRUE或FALSE表示&#xff0c;也可以用其他表示“真”和“假”的带引号字符表示&#xff0c;如true、false、yes、no等等。 cr…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

【Golang开发入门】一篇文章弄懂:值类型、指针类型

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 目录 一、前言…

【数据分析之道-Pandas(二)】DataFrame

文章目录 专栏导读1、DataFrame简介2、DataFrame创建2.1字典创建DataFrame2.2列表创建DataFrame2.3ndarrays 创建DataFrame2.4CSV文件创建DataFrame 3、DataFrame基本操作3.1添加列3.2删除列 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&…

什么是 TDSQL-C MySQL版 ---- 数据库开发者视角

我们从设计演化的角度来讲什么是 TDSQL-C MySQL 版本。 首先&#xff0c;我们有了一个纯净版 MySQL。它是一个单机数据库。存算分离&#xff1a;然后&#xff0c;我们把 MySQL 的存储引擎拿掉&#xff0c;换成云存储。这就成了存算分离。这时&#xff0c;在用户看来它还是一个…

测牛学堂:2023软件测试入门系列(软件测试方法之流程分析法)

流程分析法 流程就是用户为了完成一定的业务目的&#xff0c;需要进行的一系列的操作。 流程分析法又叫场景分析法&#xff0c;是编写测试用例最常用的方法之一。 流程分析法不校验单个功能点的正确性&#xff0c;只关心流程能不能走通。 流程分类的几个概念 场景&#xff1…

Arduno ESP8266接入中移OneNet动态显示实时数据

Arduno ESP8266接入中移OneNet动态显示实时上传数据 ✨本案例基于HTTP协议. 🌼网页查看动态数据: 📓Onenet产品创建 从全部产品服务点击进入-多协议接入 2.创建基于HTTP协议的产品 添加产品属性 创建产品成功后,可以开始添加具体的设备了。

本周一至周三总结

周一 学习如何进行竞品分析 对软件杯项目进行了竞品分析&#xff0c;测试了十余个强相关网站&#xff0c;为团队写好了竞品分析报告 分别对主要目标&#xff0c;竞品优劣点&#xff0c;竞品选择原因&#xff0c;产品创新点等进行了分析和阐述 周二 下午晚上刷了五道题 题解…

不是什么高深玩意,Arrays.asList、ArrayList.subList需要注意的坑

前言 集合是日常工作中几乎每天都在用的玩意&#xff0c;也是八股文中被翻烂的东西&#xff0c;诸如List、Map&#xff0c;确实很重要也很实用&#xff0c;但是不注意细节就比较容易踩坑。比较常见的就是今天要整理的Arrays.asList和ArrayList.subList。不是什么高深的东西&…

第一章设计模式前置知识

文章目录 软件设计模式的概念学习设计模式的必要性设计模式分类UML图类的表述方式类的表示方式 类与类之间的表示方式关联关系聚合关系组合关系依赖关系继承关系实现关系 软件设计原则开闭原则实例 里氏代换原则反例优化 依赖倒转原则组装电脑改进反例 接口隔离原则安全门案例 …