20240106-算术切片 II - 子序列

题目要求

给定一个整数数组 nums,返回 nums 的所有算术子序列的个数。

如果一个数字序列至少由三个元素组成,且任意两个连续元素之间的差值相同,则该序列称为算术序列。

例如,[1, 3, 5, 7, 9]、[7, 7, 7]和[3, -1, -5, -9]都是算术序列。

Example 1:

Input: nums = [2,4,6,8,10]
Output: 7
Explanation: All arithmetic subsequence slices are:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]

Example 2:

Input: nums = [7,7,7,7,7]
Output: 16
Explanation: Any subsequence of this array is arithmetic.

思路

使用了动态规划的方法,并且利用了哈希表(在C++中是map)来优化查找过程。

cnt数组的含义

  • cnt是一个向量,其长度等于输入数组nums的长度。每个元素cnt[i]是一个map,其中的键是等差(差值delta),值是到目前为止出现该等差的子序列个数。
  • 对于每一对ij(其中i > j),delta = nums[i] - nums[j]nums[j]nums[i]之间的差值。cnt[i][delta]记录了以nums[i]结尾,等差为delta的子序列数量。
  • 每当找到一个新的差值delta时,我们在cnt[i][delta]中至少添加1,代表由nums[j]nums[i]形成的长度为2的子序列。

如何更新cnt数组

  • 对于每个i(从1到n-1),遍历所有j(从0到i-1),计算delta
  • 如果cnt[j]中存在键为delta的项,则sum = cnt[j][delta];这意味着在nums[j]之前已经存在等差为delta的子序列。
  • 更新cnt[i][delta]。这里cnt[i][delta] += sum + 1的意思是,以nums[i]结尾的、等差为delta的子序列数量等于以nums[j]结尾的这些子序列数量(sum)加上新增的一个子序列(由nums[j]nums[i]组成)。
  • ans累加sumsum代表的是找到的等差为delta且长度至少为3的子序列数量。

如何计算长度至少为3的序列

  • 当我们在位置iji > j)找到一个等差delta时,如果cnt[j][delta]存在,这意味着在位置j之前已经有一个或多个长度至少为2的等差为delta的子序列。
  • cnt[j][delta]的值是以nums[j]结尾的、等差为delta的子序列数量,但这里重要的是,这些子序列的长度都至少是2。当我们在cnt[i][delta]中添加cnt[j][delta]时,实际上是将这些长度至少为2的子序列扩展为长度至少为3的子序列(因为我们添加了nums[i]作为新的结尾元素)。

更新ans变量

  • 每当我们在cnt[i][delta]中添加cnt[j][delta]时,这些都是新生成的长度至少为3的等差序列。
  • 因此,在更新ans时,我们只添加cnt[j][delta]的值。这样,ans最终就是所有长度至少为3的等差序列的总数。

代码

#define LL long long
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();LL ans = 0;vector<map<LL, int>> cnt(n);for (int i = 1; i < n; ++i) {for (int j = 0; j < i; ++j) {LL delta = (LL)nums[i] - (LL)nums[j];int sum = 0;if (cnt[j].find(delta) != cnt[j].end()) {sum = cnt[j][delta];}cnt[i][delta] += sum + 1;// printf("%d %d %lld\n", i, cnt[i][delta], delta);ans += sum;}}return (int)ans;}
};

Complexity Analysis

  • Time complexity : O(n2)O(n ^ 2)O(n2). We can use double loop to enumerate all possible states.

  • Space complexity : O(n2)O(n ^ 2)O(n2). For each i, we need to store at most n distinct common differences, so the total space complexity is O(n2)O(n ^ 2)O(n2).

总结

代码是LC上的教程,动态规划的思想是有的,但是算法中不需要真正存储等差序列,只需要用数量代表总数,并且更新结果的这种方法值得学习。目前自己还写不出来。

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

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

相关文章

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

小家电type-c接口PD诱骗

小家电Type-C接口PD诱骗&#xff1a;未来充电的便捷与安全 随着科技的不断发展&#xff0c;Type-C接口已经成为了许多小家电产品的标配。而PD&#xff08;Power Delivery&#xff09;诱骗技术&#xff0c;作为一种新兴的充电技术&#xff0c;更是为小家电产品的充电带来了前所…

MySQL学习笔记1: 数据库的简单介绍

目录 1. 数据库是什么2. 数据库这一类软件中的一些典型代表2.1. Oracle2.2. MySQL2.3. SQL Server2.4. SQLite (lite 轻量版) 3. 数据库的类型3.1. 关系型数据库3.2. 非关系型数据库 4. 总结 1. 数据库是什么 数据库是一类软件&#xff0c;这一类软件可以用来管理数据&#xf…

Freemarker实现Html全站静态化

全站静态化 在大型网站中&#xff0c;比如主流电商商品页&#xff0c;访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢&#xff1f;其实把页面静态化&#xff0c;好处有很多。例如&#xff1a;访问速度快&#xff0c;更有利于搜索引擎收录等。 目前主流的静态化…

复旦MBA :在多元共融中,探寻可持续发展和创新的魅力

复旦MBA的课堂从来不只在复旦校园&#xff1a;从中国到全球&#xff0c;从教室到企业&#xff0c;从每年Global Immersion Program(简称GIP)的美国耶鲁及MIT、UC Berkeley 、英国伦敦商学院、西班牙ESADE商学院、新加坡国立大学、韩国高丽大学等名校寒暑假课程&#xff0c;到Gl…

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…

如何使用UUP从windows更新服务器下载windows10原版镜像

UUP是指Windows 10中的一种更新技术&#xff0c;全称为Unified Update Platform。UUP的目标是提供更快、更高效的更新体验&#xff0c;它通过增量更新的方式来更新操作系统&#xff0c;只下载和安装实际变化的部分&#xff0c;而不是整个更新包。这样可以节省带宽和时间&#x…

Marvelous Designer 各版本安装指南

Marvelous Designer下载链接 https://pan.baidu.com/s/1ZZCraq6w2Z4JPisND8q0jA?pwd0531 1.鼠标右击【Marvelous Designer 12(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Marvelous Designer 12(64bit)】。 2.打开解压后的…

visi 各版本安装指南

visi下载链接 https://pan.baidu.com/s/1WNksdiChCPebPvRRSVakOA?pwd0531 1.鼠标右键【visi2021(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 visi2021(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup VISI 2…

如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Linux 服务器上配置基于 SSH 密钥的身份验证 介绍 SSH是一种加密协议&#xff0c;用于管理服务器并与服…

Java 开源扫雷游戏 JMine 发布介绍视频

Java 开源扫雷游戏 JMine 发布介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏&#xff0c;现已发布介绍视频。视频请见&#xff1a;https://www.bilibili.com/video/BV1Qe411m7qM/ JMine 比较重视的还原了微软的扫雷游戏。在算法设计中&#xff…

变量和对象的解构赋值

解构赋值是一种 JavaScript 语言特性&#xff0c;允许你将数组或对象的属性直接赋值给变量。这对于从函数返回多个值或初始化多个变量非常有用。 对象解构赋值&#xff1a; 当你有一个对象&#xff0c;你想将它的属性赋值给一些变量时&#xff0c;你可以使用解构赋值。例如&am…

JavaScript-运算符-笔记

1.算术运算符 加 -减 *乘法 /除法 乘方: ** a**6:a的6次方 --- a*a*a*a*a*a 取余: % 10%31 偶数: 能被2整除 和2取余等于0 奇数: 不能被2整除 和2取余不等于0 能被6整除(是6的倍数): 和6取余等于0 2.递增递减运算符 : 依次加1 -- : 依次减1 单独使…

【RockChip | RV1126】学习与开发

【RockChip | RV1126】学习与开发 文章目录 【RockChip | RV1126】学习与开发1. 资料1. 资料 您好,这是关于A191型RV1126的资料包,请您及时接收哦~链接: https://pan.baidu.com/s/1FXWVxa27Q78nI78d2QKlBQ?pwd=j7mk 提取码: j7mk 若您在开发过程中遇到技术问题,需要帮助时:…

3D Gaussian Splatting 训练自己的数据scene

目录 训练教程: 1 colmap安装: 2.1生成初始点云 2.2训练流程 读ColmapScene

基于OpenCV的图像翻转和镜像

我们将解释如何在Python中实现图像的镜像或翻转。大家只需要了解各种矩阵运算和矩阵操作背后的基本数学即可。 01. 依赖包要求 NumPy —用于矩阵运算并对其进行处理。 OpenCV —用于读取图像并将其转换为2D数组&#xff08;矩阵&#xff09;。 Matplotlib —用于将矩阵绘制为…

react setState调用为什么会触发整个组件函数的重新运行

react setState调用为什么会触发整个组件函数的重新运行例如下面的代码 function App(){const [age,setAge]useState(5);const clickHandler()>{setAge(5)}console.log("点击div时候&#xff0c;我也会被刷新")return (<div onClick{clickHandler}><di…

【LeetCode:228. 汇总区间 | 区间】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

分析抖音直播弹幕评论和礼物的websocket数据流信息,通过proto协议解析消息内容思路

现在定位到一个解析的大概位置&#xff1a; e.decode function(e, t) {e instanceof o || (e o.create(e));for (var n, i, s void 0 t ? e.len : e.pos t, u new r.webcast.im.MemberMessage(r.webcast. 通过请求找到发送请求的js代码位置&#xff0c;然后通过跟踪这…

【远程计算机,这可能是由于 Credssp 加客数据库修正】解决方案

1、winR打开运行窗口 输入gpedit.msc命令&#xff0c;若找不到&#xff0c;可以进行如下文件编辑格式为cmd echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Win…