网站首页 > 技术文章 正文
2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums,
如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。
请返回数组 nums 中交替子数组的总数。
输入: nums = [0,1,1,1]。
输出: 5。
解释:
以下子数组是交替子数组:[0] 、[1] 、[1] 、[1] 以及 [0,1] 。
答案2024-11-20:
chatgpt
题目来自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{
letmut res=0;
letmut cur=0;
letmut pre=-1;// 用于记录前一个值
for&a in&nums {
if pre != a {
cur +=1;// 如果不相同,当前交替子数组长度加1
}else{
cur =1;// 如果相同,重置为1
}
pre = a;
res += cur;// 累加交替子数组的数量
}
res // 返回结果
}
fnmain(){
letnums=vec![0,1,1,1];
println!("{}",count_alternating_subarrays(nums));
}
在这里插入图片描述
猜你喜欢
- 2024-12-17 C语言实现推箱子游戏!(超简单详细)代码思路+源码分享
- 2024-12-17 学习笔记之C#基础——数组和集合 c#中数组用法
- 2024-12-17 新函数REDUCE来了!Excel中的最强辅助,太强大了
- 2024-12-17 一篇文章学会golang语法,golang简明教程快速入门
- 2024-12-17 深入理解 Golang 中的值类型和引用类型
- 2024-12-17 SpringBoot系列之数据库初始化-datasource配置方式
- 2024-12-17 C++ 创建数组和使用数组学习笔记 c++如何建立数组
- 2024-12-17 Java Map 中那些巧妙的设计 javamap的用法
- 2024-12-17 大数据开发基础之一维数组的定义、初始化及与二维数组的区别
- 2024-12-17 go语言结构体与初始化 go 结构体初始化
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)