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

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

问题描述


一个下标从 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)

完结


相关文章
|
1天前
|
机器学习/深度学习 算法 TensorFlow
【图像识别】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别
谷物识别系统,本系统使用Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对11种谷物图片数据集('大米', '小米', '燕麦', '玉米渣', '红豆', '绿豆', '花生仁', '荞麦', '黄豆', '黑米', '黑豆')进行训练,得到一个进度较高的H5格式的模型文件。然后使用Django框架搭建了一个Web网页端可视化操作界面。实现用户上传一张图片识别其名称。
14 0
【图像识别】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别
|
5天前
|
机器学习/深度学习 人工智能 算法
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
39 0
|
6天前
|
机器学习/深度学习 Web App开发 算法
Python 机器学习算法交易实用指南(一)(5)
Python 机器学习算法交易实用指南(一)
202 2
|
6天前
|
传感器 机器学习/深度学习 存储
Python 机器学习算法交易实用指南(一)(4)
Python 机器学习算法交易实用指南(一)
169 4
|
6天前
|
机器学习/深度学习 算法 API
Python 机器学习算法交易实用指南(一)(3)
Python 机器学习算法交易实用指南(一)
89 4
|
21天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
5天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
6天前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
7天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的32QAM解调算法matlab性能仿真
```markdown - 32QAM解调算法运用BP神经网络在matlab2022a中实现,适应复杂通信环境。 - 网络结构含输入、隐藏和输出层,利用梯度下降法优化,以交叉熵损失最小化为目标训练。 - 训练后,解调通过前向传播完成,提高在噪声和干扰中的数据恢复能力。 ``` 请注意,由于字符限制,部分详细信息(如具体图示和详细步骤)未能在摘要中包含。
|
9天前
|
机器学习/深度学习 算法 网络架构
基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真
摘要:该内容展示了一个基于YOLOv2的单人口罩佩戴检测和人脸定位算法的应用。使用MATLAB2022A,YOLOv2通过Darknet-19网络和锚框技术检测图像中的口罩佩戴情况。核心代码段展示了如何处理图像,检测人脸并标注口罩区域。程序会实时显示检测结果,等待一段时间以优化显示流畅性。