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

Leetcode 3299. 连续子序列的和

1.题目基本信息

1.1.题目描述

如果一个长度为 n 的数组 arr 符合下面其中一个条件,可以称它 连续:

  • 对于所有的 1 <= i < n,arr[i] - arr[i - 1] == 1。
  • 对于所有的 1 <= i < n,arr[i] - arr[i - 1] == -1。

数组的 值 是其元素的和。

例如,[3, 4, 5] 是一个值为 12 的连续数组,并且 [9, 8] 是另一个值为 17 的连续数组。而 [3, 4, 3] 和 [8, 6] 都不连续。

给定一个整数数组 nums,返回所有 连续 非空 子序列 的 值 之和。

由于答案可能很大,返回它对 109 + 7 取模 的值。

注意 长度为 1 的数组也被认为是连续的。

1.2.题目地址

https://leetcode.cn/problems/sum-of-consecutive-subsequences/description/

2.解题方法

2.1.解题思路

动态规划

时间复杂度:O(n)

2.2.解题步骤

第一步,状态定义。dpup[i][0]表示以i结尾的最长连续递增子序列的长度(也就是能够匹配的数组的数量),dpup[i][0]表示以i结尾的所有连续递增子序列的求和结果。dpdown[i][0]表示以i结尾的最长连续递减子序列的长度(也就是能够匹配的连续递减数组的数量),dpdown[i][0]表示以i结尾的所有连续递减子序列的求和结果。

第二步,状态初始化。dpup[][0]=0,dpup[][1]=0;dpdown[][0]=0,dpdown[][1]=0

第三步,状态转移。dpup[i][0]+=dpup[i-1][0]+1,dpup[i][1]+=dpup[i-1][1]+i*(dpup[i-1][0]+1);dpdown[i][0]+=dpdown[i+1][0]+1,dpdown[i][1]+=dpdown[i+1][1]+i*(dpdown[i+1][0]+1)(注:这里使用的是+=的递推符号,因为nums后面可能出现重复的数字)

第四步,最终的sum(dpup)+sum(dpdown)-sum(nums)即为题解(因为up和down都算了一次单元素数组,所以需要减去sum(nums)的部分)

3.解题代码

Python代码

class Solution:def getSum(self, nums: List[int]) -> int:# 思路:动态规划m = max(nums)# 第一步,状态定义。dpup[i][0]表示以i结尾的最长连续递增子序列的长度(也就是能够匹配的数组的数量),dpup[i][0]表示以i结尾的所有连续递增子序列的求和结果。dpdown[i][0]表示以i结尾的最长连续递减子序列的长度(也就是能够匹配的连续递减数组的数量),dpdown[i][0]表示以i结尾的所有连续递减子序列的求和结果。dpup = [[0, 0] for _ in range(m + 2)]dpdown = [[0, 0] for _ in range(m + 2)]# 第二步,状态初始化。dpup[*][0]=0,dpup[*][1]=0;dpdown[*][0]=0,dpdown[*][1]=0# 第三步,状态转移。dpup[i][0]+=dpup[i-1][0]+1,dpup[i][1]+=dpup[i-1][1]+i*(dpup[i-1][0]+1);dpdown[i][0]+=dpdown[i+1][0]+1,dpdown[i][1]+=dpdown[i+1][1]+i*(dpdown[i+1][0]+1)(注:这里使用的是+=的递推符号,因为nums后面可能出现重复的数字)for i in nums:dpup[i][0] += dpup[i - 1][0] + 1dpup[i][1] += dpup[i - 1][1] + i * (dpup[i - 1][0] + 1)dpdown[i][0] += dpdown[i + 1][0] + 1dpdown[i][1] += dpdown[i + 1][1] + i * (dpdown[i + 1][0] + 1)# 第四步,最终的sum(dpup)+sum(dpdown)-sum(nums)即为题解(因为up和down都算了一次单元素数组,所以需要减去sum(nums)的部分)mod = 10 ** 9 + 7result = (sum([dpup[i][1] + dpdown[i][1] for i in range(m + 1)]) - sum(nums)) % modreturn int(result)

4.执行结果


文章转载自:

http://n3RVSPZ0.xykst.cn
http://5lhXDlgz.xykst.cn
http://ERWRP8Sx.xykst.cn
http://Hp7ihVRC.xykst.cn
http://24XdLsA7.xykst.cn
http://Qy95paQt.xykst.cn
http://xcdLnJwZ.xykst.cn
http://slInUTcc.xykst.cn
http://YhMjqhtH.xykst.cn
http://UrEYvq6d.xykst.cn
http://DzZAFbgL.xykst.cn
http://cvgFIior.xykst.cn
http://8ymVDKm2.xykst.cn
http://tVh3ZfTe.xykst.cn
http://jevOL6IR.xykst.cn
http://SX6oMhrc.xykst.cn
http://sYLlaLBw.xykst.cn
http://F9Ef3g6B.xykst.cn
http://oihnrA9G.xykst.cn
http://o1QvMecM.xykst.cn
http://t1HDfzkF.xykst.cn
http://cRZ5gtqJ.xykst.cn
http://J9M5yw6y.xykst.cn
http://67oLhF59.xykst.cn
http://TukGxSCp.xykst.cn
http://OvlOOd0E.xykst.cn
http://Rn5kIAnn.xykst.cn
http://Jk51co4z.xykst.cn
http://ZbDVgOOO.xykst.cn
http://LBrOzTum.xykst.cn
http://www.dtcms.com/a/245726.html

相关文章:

  • excel中自定义公式
  • 黑马点评【缓存】
  • AI中的Prompt
  • 谷歌云BigQuery分析
  • 「Unity3D」使用C#调用Android的震动功能,有三种方式
  • Linux 内核学习(11) --- Linux 链表结构
  • 按关键字批量合并 Excel 多工作簿工作表攻略-Excel易用宝
  • flowable 数据库表结构分析(超全版)
  • SPP——神经网络中全连接层输出尺寸限制的原因和解决办法
  • 以前在服务器启动了docker,现在不需要了,为了安全,去掉docker服务@Ubuntu
  • NVIDIA Container Toolkit 报错 Failed to initialize NVML: Unknown Error 的解决
  • 实现AI数据高效评估的一种方法
  • SQL进阶之旅 Day 27:存储过程与函数高级应用
  • 鸿蒙 UI 开发基础语法与组件复用全解析:从装饰器到工程化实践指南
  • NAS文件共享、PACS影像存储,速率提升400%?
  • Kotlin 协程与 ViewModel 的完美结合
  • 【二分答案1-----切木棒】
  • 视频自动生成字幕原理和自动生成字幕的应用实例
  • 事件(Event)
  • 同时装两个MySQL, 我在MySQL5的基础上, 安装MySQL8
  • 循环数组中相邻元素的最大差值
  • java BIO/NIO/AIO
  • 【unitrix】 1.3 Cargo.toml 文件解析
  • SM3算法Python实现(无第三方库)
  • 【GitOps】Kubernetes安装ArgoCD,使用阿里云MSE云原生网关暴露服务
  • 山东大学《Web数据管理》期末复习宝典【万字解析!】
  • HarmonyOS运动开发:打造便捷的静态快捷菜单
  • ArkUI-X在Android上使用Fragment开发指南
  • ThreadLocal原理及内存泄漏分析
  • 【从零学习JVM|第八篇】深入探寻堆内存