首页 > 其他分享 >2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums, 如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。 请返回数组 nums 中交替子数组的总数。 输

2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums, 如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。 请返回数组 nums 中交替子数组的总数。 输

时间:2024-11-20 13:29:23浏览次数:1  
标签:cur nums res 元素 交替 数组

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] 作为示例:

  • 处理第一个元素 0cur 增加到 1,res 变为 1(子数组 [0])。

  • 处理第二个元素 1cur 增加到 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),因为使用的变量(rescurpre)都是常数空间,不依赖于输入数组的大小,未使用额外的数据结构进行存储。

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));
}

在这里插入图片描述

标签:cur,nums,res,元素,交替,数组
From: https://www.cnblogs.com/moonfdd/p/18556676

相关文章

  • PHP二维数组排序算法函数
    以使用PHP内置的array_multisort()函数来对二维数组进行排序。array_multisort()函数可以对多个数组或多维数组的一个或多个列进行排序。下面是一个示例函数,该函数可以对二维数组按指定列进行排序:<?phpfunctionsort2DArrayByColumn(&$array,$columnKey,$sortOrder=SORT_......
  • 洛谷题单指南-二叉堆与树状数组-P2161 [SHOI2009] 会场预约
    原题链接:https://www.luogu.com.cn/problem/P2161题意解读:本题前面形式化描述已经足够清晰。解题思路:要判断线段之间是否有冲突(包含或者交叉),可以借助set,参考:https://www.cnblogs.com/jcwy/p/18447333只不过这里要统计冲突的数量,也就是允许相等的元素重复存在,可以借助multiset......
  • 3354. 使数组元素等于零
     给你一个整数数组 nums 。开始时,选择一个满足 nums[curr]==0 的起始位置 curr ,并选择一个移动 方向 :向左或者向右。此后,你需要重复下面的过程:如果 curr 超过范围 [0,n-1] ,过程结束。如果 nums[curr]==0 ,沿当前方向继续移动:如果向右移,则 递增 curr......
  • 数据结构复习 ---- 顺序表(数组)--定长版本+不定长版本
    //我的思考************////1.顺序表是一种线性结构(一对一关系),每个数据都是有一个前驱(除了第一个元素)和一个后继(除了最后一个元素)//2.顺序表分为定长顺序表(指针存储固定数量的元素)和不定长顺序表(顾名思义。。。使用较多)----类似于动态数组,就像Go语言中的切片,Pytho......
  • 2024/11/18日 日志 数据结构实验(1)---链表逆置、线性表A,B顺序存储合并、双向循环链表应
    链表逆置题目:https://pintia.cn/problem-sets/1855808612225744896/exam/problems/type/6?problemSetProblemId=1855808768018968576解答:点击查看代码structListNode*reverse(structListNode*head){structListNode*prev=NULL;structListNode*current=head;......
  • 字节青训-小C的类二进制拼图、小M的奶酪问题、小T的密码变换规则、数值操作的期望计算
    目录一、小C的类二进制拼图问题描述测试样例解题思路:问题理解数据结构选择算法步骤第一版代码:最终代码:  二、小M的奶酪问题问题描述测试样例解题思路:问题理解数据结构选择算法步骤 最终代码:运行结果: 三、小T的密码变换规则问题描述测试样例 解题......
  • 字节青训-判断数组是否单调、判断回旋镖的存在、字符串解码问题、小F的矩阵值调整、数
    目录一、判断数组是否单调问题描述测试样例解题思路:解题思路数据结构选择算法步骤 最终代码:运行结果:​编辑  二、判断回旋镖的存在问题描述测试样例解题思路: 解题思路算法步骤最终代码:运行结果:​编辑 三、字符串解码问题问题描述测试样例 解题思......
  • 724. 寻找数组的中心下标
    题目自己写的classSolution{public:intpivotIndex(vector<int>&nums){intn=nums.size();vector<int>s(n,0);s[0]=nums[0];for(inti=1;i!=n;++i)s[i]=s[i-1]+nums[i];......
  • 189. 轮转数组
    题目自己写的老拉了classSolution{public:voidrotate(vector<int>&nums,intk){constintn=nums.size();intans[100010]={};for(inti=0;i<n;++i)ans[(i+k)%n]=nums[i];for(inti=......
  • 洛谷题单指南-二叉堆与树状数组-P5677 [GZOI2017] 配对统计
    原题链接:https://www.luogu.com.cn/problem/P5677题意解读:所谓好的配对,通过分析公式∣ax−ay∣≤∣ax−ai∣(i≠x),可以得知就是一个ax与其差的绝对值最小的形成的配对,在数轴上就是距离ax最近的点ay,配对是下标(x,y),给定若干个区间[l,r],每个区间的配对数*区间编号的累加。解题思路:......