【力扣算法05】之 _1911_ 最大子序列交替和- python

news2024/11/29 10:41:36

文章目录

  • 问题描述
    • 示例 1
    • 示例2
    • 示例3
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
  • 运行示例代码
    • 示例1
    • 示例2
    • 示例3
  • 完结

问题描述

在这里插入图片描述

一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。
给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。 一个数组的 子序列 是从原数组中删除一些元素后(也可能一个也不删除)剩余元素不改变顺序组成的数组。比方说,[2,7,4] 是 [4,2,3,7,2,1,4] 的一个子序列(加粗元素),但是 [2,4,2] 不是。
在这里插入图片描述

示例 1

输入:nums = [4,2,5,3]
输出:7
解释:最优子序列为 [4,2,5] ,交替和为 (4 + 5) - 2 = 7 。

示例2

输入:nums = [5,6,7,8]
输出:8
解释:最优子序列为 [8] ,交替和为 8 。

示例3

输入:nums = [6,2,1,2,4,5]
输出:10
解释:最优子序列为 [6,1,5] ,交替和为 (6 + 5) - 1 = 10 。

提示

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思路分析

在这里插入图片描述

  • 首先, 定义数组 dp0 和 dp1,长度都为 n,并将它们初始化为全零数组。dp0[i] 表示从 nums[0] 到 nums[i] 的子数组中,以 nums[i] 结尾的交替和的最大值;dp1[i] 表示从 nums[0] 到 nums[i] 的子数组中,以 nums[i] 结尾的交替和末尾为正数的最大值。

  • 然后,我们开始迭代遍历数组 nums,从索引 1 开始。在每次迭代中,我们根据以下公式更新 dp0 和 dp1 的值:

dp0[i] = max(dp0[i - 1], dp1[i - 1] - nums[i])
dp1[i] = max(dp1[i - 1], dp0[i - 1] + nums[i])

  • 对于 dp0[i],我们有两个选择:要么不选择当前元素 nums[i],即交替和不变;要么将前一个交替和末尾的正数减去当前元素 nums[i],以得到更大的交替和。所以,dp0[i] 的值可以通过比较 dp0[i-1] 和 dp1[i-1] - nums[i] 的大小来确定,取其中较大的值作为 dp0[i] 的结果。

  • 对于 dp1[i],同样有两个选择:要么不选择当前元素 nums[i],即交替和末尾为正数的最大值不变;要么将前一个交替和末尾的负数加上当前元素 nums[i],以得到更大的交替和。所以,dp1[i] 的值可以通过比较 dp1[i-1] 和 dp0[i-1] + nums[i] 的大小来确定,取其中较大的值作为 dp1[i] 的结果。

  • 通过不断更新 dp0 和 dp1 数组的值,我们就可以得到从 nums[0] 到 nums[i] 的子数组中,以 nums[i] 结尾的交替和的最大值和交替和末尾为正数的最大值。

  • 最后, 返回 dp0[n - 1] 和 dp1[n - 1] 中的较大值,即为所求的交替元素和的最大值。

代码分析

在这里插入图片描述

代码实现了一个计算交替元素和的最大值的函数 maxAlternatingSum

class Solution(object):
    def maxAlternatingSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

首先,这是一个名为 Solution 的类定义,它实现了一个方法 maxAlternatingSum。该方法接受一个参数 nums,它是一个整数列表,并且返回一个整数作为结果。

n = len(nums)
dp0 = [0] * n
dp1 = [0] * n

接下来,通过获取数组 nums 的长度 n,创建了两个与 nums 相同长度的全零数组 dp0dp1,用于存储中间计算的结果。

dp1[0] = nums[0]  # 初始化

dp1 的首元素设置为 nums 的首元素,作为初始值。

for i in range(1, n):
    dp0[i] = max(dp0[i - 1], dp1[i - 1] - nums[i])
    dp1[i] = max(dp1[i - 1], dp0[i - 1] + nums[i])

然后,使用一个循环从索引 1 开始遍历数组 nums,对每个位置 i 进行动态规划计算。根据之前解释的公式,更新 dp0[i]dp1[i] 的值。

return max(dp0[n - 1], dp1[n - 1])

最后,返回 dp0dp1 中的最大值作为结果。

代码的核心思想是使用动态规划来求解交替元素和的最大值。通过迭代计算并更新 dp0dp1 数组中的值,最终得到结果。

完整代码

class Solution(object):
    def maxAlternatingSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 创建Solution类,定义maxAlternatingSum方法,该方法接受整数列表nums作为参数,返回一个整数作为结果

        n = len(nums)
        # 获取整数列表nums的长度,即列表中元素的数量

        dp0 = [0] * n
        dp1 = [0] * n
        # 创建两个初始长度为n的全零列表dp0和dp1,用于记录中间计算结果

        dp1[0] = nums[0]
        # 将dp1列表的第一个元素设置为nums列表的第一个元素,作为初始化值

        for i in range(1, n):
            # 循环从索引1开始遍历整数列表nums

            dp0[i] = max(dp0[i - 1], dp1[i - 1] - nums[i])
            # 在位置i不选择当前元素时,最大交替和为前一个位置不选择元素的最大交替和dp0[i-1]和dp1[i-1]减去当前元素nums[i]的较大值

            dp1[i] = max(dp1[i - 1], dp0[i - 1] + nums[i])
            # 在位置i选择当前元素时,最大交替和为前一个位置选择元素的最大交替和dp1[i-1]和dp0[i-1]加上当前元素nums[i]的较大值

        return max(dp0[n - 1], dp1[n - 1])
        # 返回dp0和dp1列表中最后一个元素的较大值作为结果,即表示在最后一个位置不选择当前元素和选择当前元素两种情况下的最大交替和

运行示例代码

示例1

nums = [4, 2, 5, 3]
solution = Solution()
result = solution.maxAlternatingSum(nums)
print(result)

在这里插入图片描述

示例2

nums = [5,6,7,8]
solution = Solution()
result = solution.maxAlternatingSum(nums)
print(result)

在这里插入图片描述

示例3

nums = [6,2,1,2,4,5]
solution = Solution()
result = solution.maxAlternatingSum(nums)
print(result)

在这里插入图片描述

完结

在这里插入图片描述

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

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

相关文章

804. n的阶乘

链接&#xff1a; https://www.acwing.com/problem/content/806/ 题目&#xff1a; 输入一个整数 nn&#xff0c;请你编写一个函数&#xff0c;int fact(int n)&#xff0c;计算并输出 nn 的阶乘。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包…

OpenCV(图像处理)-图片搜索

图片搜索 1.知识介绍2.实现流程2.1 计算特征点与描述子2.2 描述子的匹配2.3 求出单应性矩阵并画出轮廓2.4 将特征点标出 此篇博客作者仍在探索阶段&#xff0c;还有一些模糊的概念没有弄懂&#xff0c;请读者自行分辨。 1.知识介绍 Opencv进行图片搜索需要的知识有&#xff1…

多个input框或其他框的值相加之和并且处理精度问题

需求&#xff1a;实付金额不能手动输入&#xff0c;并且等于购买数量✖优惠价➖平台补贴➖店铺补贴 把需要处理的这几个框绑上change事件等于同一个方法名 change"handleChange" handleChange(value){let _this this;let isNull validatenull;_this.ruleForm.pre…

【JavaEE】项目的部署-让网络上的人都能访问你的网站

项目的部署-让网络上的人都能访问你的网站 文章目录 【JavaEE】项目的部署-让网络上的人都能访问你的网站1. 搭建环境1.1 jdk1.2 Tomcat1.2.1 上传tomcat程序1.2.2 给启动脚本加上可执行权限1.2.3 启动Tomcat1.2.4 让服务器运行8080端口的流量通过 1.3 MySQL 2. 代码修改2.1 修…

协议逆向工程(图

协议逆向工程流程图 协议状态机推断的一般示例 状态机方法时间轴

MySQL的存储引擎、建库、权限管理

目录 一、前言 1.MySQL的介绍 二、存储引擎 1.什么是存储引擎 2.常见存储引擎 2.1.InnoDB(MySQL默认引擎) 2.1.1.四种隔离级别 2.2.MyISAM存储引擎 2.3.Memory存储引擎 3.ACID事务 三、CRUD操作 1.插入数据 2.查询数据 3.修改数据 4.删除数据 四、数据库 1.默认…

自动化测试实践经验和教训

目录 前言&#xff1a; 一、所谓自动化是为了软件发布服务的&#xff0c;并不只是为了测试服务 二、不要事后去计算人工替代率&#xff0c;而是要参考自动化测试有效性 三、度量一个自动化测试的可实施性可以从其可控制性或者可测试性上来考虑 四、试点推进自动化测试 五…

WebDAV之π-Disk派盘 + Koder

Koder 支持WebDAV方式连接π-Disk派盘。 一款可以让你在iPhone、iPad上写各种编程语言代码的app,码农不要错过。 Koder是iPad和iPhone的代码编辑器。它确实具有许多功能,包括语法突出显示,代码段管理器,选项卡式编辑,查找和替换代码,编辑器主题,远程和本地文件连接等…

Java基础---枚举

枚举类型是指由一组固定的常量组成合法的类型Java中由关键字enum来定义一个枚举类型 Java中枚举的好处如下&#xff1a; 1-枚举可以的 valueOf 可以自动对入参进行非法参数的校验 2-可以调用枚举中的方法&#xff0c;相对于普通的常量来说操作性更强 3-枚举实现接口的话&#…

Day_63-65 集成学习之 AdaBoosting

目录 Day_63-65 一. 基本概念介绍 1. 集成学习 2. 弱分类器与强分类器 二. AdaBoosting算法 1. AdaBoosting算法框架介绍 2. AdaBoosting算法过程 三. 代码的实现过程 1. WeightedInstances类 2. 构造弱分类器的StumpClassifier类和抽象类SimpleClassifier 3. 主类Booster的…

Elastic 连续第三年被评为 2023 年 Gartner® Magic Quadrant™ 的 APM 和可观察性远见者

作者&#xff1a;Gagan Singh 我们很高兴地宣布&#xff0c;Elastic 连续第三年被评为 2023 年 Gartner 应用程序性能监控 (APM) 和可观测性魔力象限中的远见者。 Elastic 因其愿景的完整性和执行能力而受到认可 我们相信&#xff0c;Elastic 被认可为远见者&#xff0c;验证了…

自动化测试平台策略之:自动化测试与项目的结合之路

目录 前言&#xff1a; 一、自动化测试开展在整个项目中存在的一些问题 二、自动化测试与项目结合之路 三、自动化测试平台之项目系统建设 前言&#xff1a; 自动化测试平台是实施自动化测试的关键组成部分&#xff0c;它可以帮助测试团队提高测试效率、加速反馈周期&#xff0…

vue 后台返回列表H5点击按钮加载更多分页数据与van-tab记住选中状态

效果图&#xff08;点击更多订单加载&#xff0c;一次加载10条&#xff09;&#xff1a; <template><div id"order" class"wap-el page-container wap-com-page"><section><com-header></com-header></section><di…

6.1Java EE——Spring介绍

一、Spring概述 String框架的核心技术 Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE一站式&#xff08;full-stack&#xff09;轻量级开源框架。它最为核心的理念是IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;&#xff0c;其中&…

声音合成与克隆——制作用于训练的声音数据集

前言 1.PaddleSpeech 是一个简单易用的all-in-one 的语音工具箱&#xff0c;支持语音处理的相关操作&#xff0c;如语音知别&#xff0c;语音合成&#xff0c;声纹识别&#xff0c;声音分类&#xff0c;语音翻译&#xff0c;语音唤醒等多个方向的应用开发。 这里只使用到语音…

C++之模板类重写基类构造函数(一百五十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

matlab[1,1]生成100个随机点

close all; clc; x linspace(0,1,200); y 0 rand(1,200); sz 25; c linspace(1,10,length(x)); scatter(x,y,sz,c,filled)

IO流学习07(Java)

序列化流&#xff08;对象操作输出流&#xff09;&#xff1a; 可以把java中的对象写到本地文件中。 public objectoutputstream(outputstream out) 把基本流包装成高级流。 public final void writeobject(object obj) 把对象序列化&#xff08;写出&#xff09;到文…

如何在Docker和Kubernetes中使用代理IP?

Docker和Kubernetes是目前非常流行的容器化技术&#xff0c;这些技术被广泛用于开发、部署和管理应用程序。在某些情况下&#xff0c;需要使用代理IP来访问特定的网络资源。本文将介绍如何在Docker和Kubernetes中使用代理IP&#xff0c;并提供详细的举例说明。 一、在Docker中使…