2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums, 如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。 请返回数组 nums 中交替子数组的总数。 输
2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums,
如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。
请返回数组 nums 中交替子数组的总数。
输入: nums = [0,1,1,1]。
输出: 5。
解释:
以下子数组是交替子数组:[0] 、[1] 、[1] 、[1] 以及 [0,1] 。
答案2024-11-20:
题目来自leetcode3101。
大体步骤如下:
1.输入数据:首先,我们有一个二进制数组 nums,例如 nums = [0, 1, 1, 1]。我们的目标是计算这个数组中所有交替子数组的数量。
2.交替子数组的定义:交替子数组是指一个子数组中,相邻的元素值必须不同。例如:
2.1.数组 [0] 和 [1] 都是交替子数组,因为它们的元素没有相邻重复的情况。
2.2.数组 [1, 1] 不是交替子数组,因为两个相邻的元素都是 1。
3.初始化变量:
3.1.res:用于存放交替子数组的总数,初始值为 0。
3.2.cur:用于记录当前交替子数组的长度,初始值为 0。
3.3.pre:一个辅助变量,用于保存前一个元素的值,初始设置为 -1(方便与第一个元素进行比较)。
4.遍历数组:
4.1.对于给定的数组 nums 中的每一个元素 a,执行以下操作:
4.1.1.非重复情况:如果当前元素 a 与前一个元素 pre 不相等,表示交替状态继续,故将当前计数 cur 加 1。
4.1.2.重复情况:如果当前元素 a 与前一个元素 pre 相等,则交替状态被破坏,将当前计数 cur 重置为 1,表示当前元素 a 作为新的交替子数组的起始元素。
4.1.3.更新 pre 为当前的元素 a,以便于下一次迭代进行比较。
4.1.4.将当前的 cur 值累加到总数 res 中。这将确保包含所有以当前元素为结束元素的交替子数组。
5.结束遍历:当遍历完整个数组后,res 将包含所有可能的交替子数组的总数。
6.返回结果:最后,函数返回 res,这就是我们需要的交替子数组的数量。
示例分析
以输入 nums = [0, 1, 1, 1] 作为示例:
处理第一个元素
0,cur增加到 1,res变为 1(子数组[0])。处理第二个元素
1,cur增加到 2,res变为 3(包括子数组[1]和[0, 1])。处理接下来的两个元素
1:对于第一个重复
1,由于与前面的pre(也是1)相等,cur重置为 1,res增加到 4(子数组[1])。对于第二个重复
1,同样,cur重置为 1,res增加到 5(再加上[1])。
因此,最后输出结果为 5,包含的交替子数组为
[0]、[1]、[1]、[1]、[0, 1]。
时间复杂度和空间复杂度
时间复杂度:O(n),其中 n 是数组
nums的长度。由于只需对数组遍历一次进行计算,所需的操作量与数组长度成正比。空间复杂度:O(1),因为使用的变量(
res、cur、pre)都是常数空间,不依赖于输入数组的大小,未使用额外的数据结构进行存储。
Go完整代码如下:
package main
import (
"fmt"
)
func countAlternatingSubarrays(nums []int) int64 {
var res, cur int64
pre := -1
for _, a := range nums {
if pre != a {
cur++
} else {
cur = 1
}
pre = a
res += cur
}
return res
}
func main() {
nums := []int{0, 1, 1, 1}
fmt.Println(countAlternatingSubarrays(nums))
}

Rust完整代码如下:
fn count_alternating_subarrays(nums: Vec<i32>) -> i64 {
let mut res = 0;
let mut cur = 0;
let mut pre = -1; // 用于记录前一个值
for &a in &nums {
if pre != a {
cur += 1; // 如果不相同,当前交替子数组长度加1
} else {
cur = 1; // 如果相同,重置为1
}
pre = a;
res += cur; // 累加交替子数组的数量
}
res // 返回结果
}
fn main() {
let nums = vec![0, 1, 1, 1];
println!("{}", count_alternating_subarrays(nums));
}

2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums, 如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。 请返回数组 nums 中交替子数组的总数。 输的更多相关文章
- 输出有序数组的中两个元素差值为指定值diff的两个元素
题目: 输出有序数组的中两个元素差值为指定值diff的两个元素. 思路: 这与输出两个元素的和的值为一定值类似,需要两个指针,不同的是:指针不是一左一右,而是一前一后. 如果差值等于diff,则返回: ...
- 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发
import java.util.Scanner; public class Test21 { public static void main(String[] args) { //定义并初始化数组 ...
- c语言实践 创建两个包含8个元素的double类型数组,第二个元素的每个元素的值都是对应前一个元素的前n个元素的和
意思就是第二个元素的num[2]等于第一个元素的num[0]+num[1]+num[2] #define COUNT 8 int main(void) { double num1[COUNT]; do ...
- 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组
使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...
- php对UTF8字体串进行单字分割返回数组
在网上查了很多字符串分割方法,都无法正确对UTF8字符串进行正确分割返回单个字符的数组.经过对FTU8编码的分析写出了下面的方法对UTF8进行分割.本人测试可用.本方法只支持UTF8编码的,其它编码转 ...
- 【跟着子迟品 underscore】如何优雅地写一个『在数组中寻找指定元素』的方法
Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...
- 让ar执行queryall和queryrow方法返回数组
让ar执行queryall和queryrow方法返回数组 <?phpnamespace common\components;use \CActiveRecord;use \Yii;use \CD ...
- javascript 返回数组中不重复的元素
这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ...
随机推荐
- Devexpress PdfViewer汉化及隐藏右键菜单
先看效果图 1.效果图 隐藏了打印与文档属性功能 2.原图 1.关键事件 PopupMenuShowing public From() { InitializeComponent(); //弹出菜单加 ...
- 使用FastAPI来开发项目,项目的目录结构如何规划的一些参考和基类封装的一些处理
使用FastAPI开发项目时,良好的目录结构可以帮助你更好地组织代码,提高可维护性和扩展性.同样,对基类的封装,也可以进一步减少开发代码,提供便利,并减少出错的几率. 下面是一个推荐的目录结构示例: ...
- Shell 避免无限递归
在编写 Shell 脚本时,有时会产生我们不期望的递归. 比如说,我曾经写过一个脚本,名为 foo.sh. foo.sh 的内容如下: function foo { # TODO } foo 然后我在 ...
- Java Web专题攻关
servlet概念 servlet其实就是运行在服务器的一个小程序 如何去理解呢?我们访问服务器的资源包括静态资源和动态资源,其中静态资源是我们放置的模板,CSS.JS等文件,是不变的.而我们访问的动 ...
- windows server 2019 IIS网站属性上没有asp.net标签 ,aspnet_regiis -i 不能安装
在新的服务器版本已经不能通过 aspnet_regiis -i安装了,可以通过以下语句完成: dism /online /enable-feature /featurename:IIS-ASPNET4 ...
- JavaScript – Temporal API & Date
前言 Temporal API 是 JS 的新东西,用来取代 Date.虽然现在 (12-09-2024) 依然没有任何游览器支持 Temporal API,但它已经是 stage 3 了,而且有完整 ...
- JAVAEE——navicat安装
Navicat Premium 15激活步骤 准备 Navicat Premium 15.Navicat Premium 15注册机 用到的都放在这里了: 链接:https://pan.baidu.c ...
- k8s 中的 Ingress 简介
〇.前言 前边已经介绍了 k8s 中的相关概念和 Service,本文继续看下什么是 Ingress. Ingress 的重要性不言而喻,它不仅统一了集群对外访问的入口,还提供了高级路由.七层负载均衡 ...
- Hugging Face + JuiceFS:多用户多节点环境下提升模型加载效率
Hugging Face 的 Transformers 是一个功能强大的机器学习框架,提供了一系列 API 和工具,用于预训练模型的下载和训练.为了避免重复下载,提高训练效率,Transformers ...
- VMware Vsphere 8.0 ESXI 主机部署
一. VMware vSphere 8.0新特性 VMware vSphere 8.0是一个全新的版本,引入了许多新功能,其中最主要的新功能包括 1.集中式云控制台 使 IT 管理员能够借助 vSph ...