【力扣 - 每日一题】3101. 交替子数组计数 | 朴素枚举 + 递推思想 + 优化空间 | Go

Problem: 3101. 交替子数组计数

题意

给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。
返回数组 nums 中交替子数组的数量。

示例 1:
输入: nums = [0,1,1,1]
输出: 5
解释:
以下子数组是交替子数组:[0] 、[1] 、[1] 、[1] 以及 [0,1] 。

示例 2:
输入: nums = [1,0,1,0]
输出: 10
解释:
数组的每个子数组都是交替子数组。可以统计在内的子数组共有 10 个。

提示:
1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
nums[i] 不是 0 就是 1 。

思路1 朴素枚举

第一想法肯定是枚举子数组的起点和终点,如果符合条件的话,答案就加1
稍微优化了下,首先枚举子数组的起点,然后从起点往后遍历,如果这一位和上一位不相等的话,答案加1;否则,该起点的枚举就结束了,break掉。
因为长度为1的子数组肯定是符合要求的,所以就预先把这些加到答案里,后面的遍历只是为了找出长度>=2的子数组

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

func countAlternatingSubarrays(nums []int) int64 {var ans int64 =  int64(len(nums))for i := 0; i < len(nums); i ++ {//起点for j := i + 1; j < len(nums); j ++ {if nums[j] != nums[j-1] {ans++}else{break}}}return ans
}

思路2 递推思想

考虑如何优化思路1,其实可以用一个递推的思想,
假设当前枚举到下标为i的元素,前面已经有now个符合条件的子数组,那么如果下标为i的元素和下标为i-1的元素不同,相当于以下标为i的元素结尾的符合条件的子数组一共有now+1个,其中+1是第i个单独元素的集合,这个时候now也要加1,因为这个元素对后面的元素也是有贡献的;
如果下标为i的元素和下标为i-1的元素相同,相当于以下标为i的元素结尾的符合条件的子数组只有1个,即第i个单独元素的集合,这个时候now也要重新计数。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

func countAlternatingSubarrays(nums []int) int64 {dp := make([]int64,len(nums))dp[0] = 1var now int64 = 1for i := 1; i < len(nums); i ++ {dp[i] = dp[i-1] + 1 //加上第i个单独元素的集合if nums[i] == nums[i-1] {now = 1 //重新计数}else{dp[i] += nownow = now + 1}}return dp[len(nums)-1]
}

思路3 优化空间

思路2的dp数组转移的时候只用到了dp[i-1]的状态,其实完全可以用变量来替代

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

func countAlternatingSubarrays(nums []int) int64 {var ans,now int64 = 0,0var las int = -1for _,elem := range nums {if las == elem {//相等的话 now = 1 //只有elem这个子数组符合要求}else{now = now + 1 //在加上elem这个子数组}las = elemans = ans + now}return ans
}

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

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

相关文章

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中&#xff0c;Bitmap类型和Byte[]类型之间的相互转…

326. 3 的幂

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 一、题目 …

Symfony事件调度系统:掌控应用生命周期的利器

Symfony是一个高度灵活的PHP框架&#xff0c;用于创建高质量的 web 应用程序。它提供了一个强大的事件调度系统&#xff0c;允许开发者在应用程序的不同阶段触发和监听事件。这种机制使得代码解耦和重用变得更加容易&#xff0c;同时也提高了应用程序的可扩展性。本文将详细介绍…

Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)

Linux&#xff1a;进程间通信&#xff08;二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量&#xff09; 上次结束了进程间通信一&#xff1a;Linux&#xff1a;进程间通信&#xff08;一.初识进程间通信、匿名管道与命名管道、共享内存&#xff09; 文章目录 …

vivado DIRECT_ENABLE、DIRECT_RESET

直接启用&#xff08;_E&#xff09; 在输入端口或其他信号上应用DIRECT_ENABLE&#xff0c;使其直接进入启用 当有多个可能的启用时&#xff0c;或者当您想强制 合成工具来使用触发器的使能线。 体系结构支持 所有架构。 适用对象 DIRECT_ENABLE属性可以放置在任何端口或信号上…

C++进阶:继承和多态

文章目录 ❤️继承&#x1fa77;继承与友元&#x1f9e1;继承和静态成员&#x1f49b;菱形继承及菱形虚拟继承&#x1f49a;继承和组合 ❤️多态&#x1fa77;什么是多态&#xff1f;&#x1f9e1;多态的定义以及实现&#x1f49b;虚函数&#x1f49a;虚函数的重写&#x1f499…

吴恩达机器学习作业ex8:K 异常检测和推荐系统(Python实现)详细注释

文章目录 1 异常检测1.1 高斯分布1.2 估计高斯参数1.3 选择阈值 ε1.4 高维数据集 2 推荐系统2.1 电影评分数据集2.2 协作过滤学习算法2.2.1 协同过滤成本函数2.2.2 梯度协同过滤2.2.3 Regularized cost function2.2.4 正则梯度 2.3 学习电影推荐2.3.1 推荐 后记 1 异常检测 在…

c++入门基础篇(上)

前言&#xff1a; 我们在之前学完了c语言的大部分语法知识&#xff0c;是不是意味着我们可以马上从事开发呢&#xff1f;其实行业中的绝大部分岗位都用不到c语言&#xff0c;那我们为什么要学c语言呢。c语言虽然和我们日常开发没有很大的关系&#xff0c;但是学习c语言可以为我…

PLSQL Day6

declare type i_type is table of varchar2(50) index by varchar2(50); tab i_type; idx varchar2(50); begin tab(A):东邪; tab(a):西毒; tab(g):南帝; tab(d):北丐; tab(p):中神通; idx : tab.first; loop dbms_output.put_line(tab(idx)); exi…

14.x86游戏实战-汇编指令cmp test

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

LLm与微调

推荐尝试的微调模型 internlm2-20b-chat&#xff0c;internlm2-7b-chat&#xff0c; Qwen2-7B-Instruct, Qwen2-1.5B-Instruct, Qwen1.5-32B-Chat (Qwen2-0.5B、Qwen2-1.5B, qwen1.5的4B&#xff0c;7B&#xff0c;14B&#xff0c;32B) glm-4-9b-chat, glm-4-9b-chat-1m, gl…

Redis教程(二十三):Redis的底层数据结构

Redis的数据类型 Redis是一种高性能的key-value数据库,广泛用于缓存、消息队列、应用程序会话管理等领域。它之所以能提供高效的数据操作性能,很大程度上归功于其底层使用了多种优化过的数据结构来存储数据。以下是Redis用来存储不同类型键值对的一些核心数据结构: 1. 字符串…

SLAM相关知识

目前在SLAM上的传感器主要分为两大类&#xff1a;激光雷达和摄像头 激光雷达&#xff1a;单线、多线 摄像头&#xff1a;单目相机&#xff08;普通USB相机&#xff09;、双目相机&#xff08;2个普通的USB相机&#xff09;、单目结构光&#xff08;深度相机&#xff09;、双目…

【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题

文章目录 1.环境背景2. 需求背景3. 解决方法3.1 在mac的终端查看虚拟机NAT网络3.2 查看unbuntu节点2的网络配置3.3 问题定位与解决3.3.1 检查是否有冲突3.3.2 冲突解决方法 4. 总结4.1 NAT 网关的原理4.2 VMware Fusion 的 NAT 模式4.3 为什么网关冲突会引起问题4.4 理解配置冲…

Javadoc介绍

Javadoc 是用于生成 Java 代码文档的工具。它利用特定的注释格式,将 Java 源代码中的注释提取出来,并生成 HTML 文档。Javadoc 注释通常位于类、接口、构造函数、方法和字段的声明之前,以 /** 开始,以 */ 结束。以下是 Javadoc 注释的一些主要元素和使用方法: 基本语法 …

HTML 学习指南:从入门到精通

什么是HTML HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的框架。掌握HTML不仅能更好的理解网页的结构&#xff0c;还能为进一步学习CSS、JavaScript等前端技术打下坚实的基础。本篇文章将为你规划一条从HTML入门到精通的学习路线&#xff0c;并概述每个…

AutoHotKey自动热键(五)添加WINDOWS秘笈指令-输入瞬间启动功能

在AUTOHOTKEY的使用中,不仅仅可以监听组合热键,还可以监听正常文本击键录入,这是另一种监听方式,比如依次击键jsq之后直接弹出<计算器>工具,或者依次击键sj之后直接输出135****5564的手机号码,等等,这就是autohotkey的录入击键监听,以双冒号为开头:: 因这种录入监听像极了…

【UE5】仅修改结构体的若干个数据

蓝图中的结构体变量 | 虚幻引擎4.27文档 (unrealengine.com) 连线连到傻&#xff0c;因为如果某个变量set空值也一起过去了。一查发现有这个节点。

EEG源定位(EEG Source Localization)

EEG源定位&#xff08;EEG Source Localization&#xff09;是一种用于确定大脑内部电活动来源的方法。通过在头皮上记录的电信号&#xff08;EEG&#xff09;&#xff0c;源定位技术可以推断这些信号的起源&#xff0c;即确定大脑中的哪些区域产生了这些电活动。这对于理解大脑…

【面向就业的Linux的基础】从入门到熟练,探索Linux的秘密(十三)-常用的命令

上述是一些系统命令的基本练习&#xff0c;可以当做日常笔记学习收藏一下&#xff01;&#xff01;&#xff01; 目录 前言 一、文件权限 二、文件检索 三、查看文件内容 四、用户相关 五、工具 六、安装软件 七、作业​​​​​​​ 总结 前言 上述是一些系统命令的…