首页 > 其他分享 >2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.

2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.

时间:2024-07-13 17:19:36浏览次数:15  
标签:匹配 nums pattern 整数 数组 长度

2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。

一个子数组nums[i..j]的大小为m+1,如果满足以下条件,则我们称该子数组与模式数组pattern匹配:

1.若pattern[k]为1,则nums[i+k+1] > nums[i+k];

2.若pattern[k]为0,则nums[i+k+1] == nums[i+k];

3.若pattern[k]为-1,则nums[i+k+1] < nums[i+k]。

需要计算匹配模式数组pattern的nums子数组的数量并返回。

输入:nums = [1,2,3,4,5,6], pattern = [1,1]。

输出:4。

解释:模式 [1,1] 说明我们要找的子数组是长度为 3 且严格上升的。在数组 nums 中,子数组 [1,2,3] ,[2,3,4] ,[3,4,5] 和 [4,5,6] 都匹配这个模式。

所以 nums 中总共有 4 个子数组匹配这个模式。

答案2024-07-13:

chatgpt

题目来自leetcode3036。

大体步骤如下:

1.在主函数main中,定义了一个nums数组为[1,2,3,4,5,6]和一个模式数组pattern为[1,1]。然后调用countMatchingSubarrays函数,并输出结果。

2.countMatchingSubarrays函数的作用是计算匹配模式数组pattern的nums子数组的数量。它首先将模式数组pattern的长度赋值给m,然后在模式数组末尾添加一个值为2的元素。接着遍历nums数组,将每相邻两个数的大小关系转换为-1、0或1,并存储在pattern数组中。

3.根据Z算法,创建一个数组z用于存储匹配长度。然后利用两个指针l和r,以及i遍历模式数组,并根据当前位置i和匹配长度z[i]更新l、r和z[i]的值,直到找到所有的匹配长度。

4.最后,在z数组中,从第m+1个值开始遍历,如果匹配长度等于模式数组长度m,则将计数器ans加一。

综上所述,总的时间复杂度为O(n)(n为nums数组的长度),总的额外空间复杂度为O(n)。

Go完整代码如下:

package main

import (
	"fmt"
	"cmp"
)

func countMatchingSubarrays(nums, pattern []int) (ans int) {
	m := len(pattern)
	pattern = append(pattern, 2)
	for i := 1; i < len(nums); i++ {
		pattern = append(pattern, cmp.Compare(nums[i], nums[i-1]))
	}

	n := len(pattern)
	z := make([]int, n)
	l, r := 0, 0
	for i := 1; i < n; i++ {
		if i <= r {
			z[i] = min(z[i-l], r-i+1)
		}
		for i+z[i] < n && pattern[z[i]] == pattern[i+z[i]] {
			l, r = i, i+z[i]
			z[i]++
		}
	}

	for _, lcp := range z[m+1:] {
		if lcp == m {
			ans++
		}
	}
	return
}


func main() {
	nums := []int{1,2,3,4,5,6}
	pattern := []int{1,1}
	fmt.Println(countMatchingSubarrays(nums,pattern))
}

在这里插入图片描述

标签:匹配,nums,pattern,整数,数组,长度
From: https://www.cnblogs.com/moonfdd/p/18300373

相关文章

  • 数组
    数组数组初始化/*数组(arrays)1、相同数据(元素)类型的有序集合-从0开始的2、首先声明数组变量才能在程序中使用数组类型数组名字声明数组-声明数组变量的语法int[]nums;//首选方法或intnums[];//效果相同但不是首选方法创建数组-使用n......
  • 2024/7/13 每日一题:数组是否有序
    3011.数组是否可以变为有序给你一个下标从0开始且全是正整数的数组nums。一次操作中,如果两个相邻元素在二进制下数位为1的数目相同,那么你可以将这两个元素交换。你可以执行这个操作任意次(也可以0次)。如果你可以使数组变有序,请你返回true,否则返回false。......
  • js 树形数组转一维数组,或一维数组转树形数组
    树形数组转一维数组要将一棵树结构(包含children属性)拍平为一个一维数组,可以使用递归或迭代的方法。下面是两种常见的实现方式:1.使用递归functionflattenTree(tree){letresult=[];tree.forEach(node=>{result.push(node);if(node.children){......
  • 【C++编程】数组、函数、结构体、指针、类
    数组:存储一个固定大小的相同类型元素的顺序集合声明、初始化:typearrayName[size0][size1]...={{value00,value01,...},{value10,value11,...},...};intmy_array[2][3]={{1,2,3},{4,5,6}};访问数组元素:arrayName[index0][index1]...;intget_eleme......
  • C语言——数组、sizeof关键字
    一、数组1.数组的引入与定义: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。 要使用数组,必须在程序中先定义数组,即通知......
  • C++数组 字符串
    是什么:相同类型元素的集合写法:intexample[3]//数组在声明大小时必须为常数数组名example是个指针类型如int*ptr=example;数组索引的工作原理:example[3]//从首地址位置偏移数组类型大小(int是4字节)乘索引值(4*3)个字节//从当前字节位置往后读四个字节;可能出现的错误:ex......
  • [LeetCode]961. 在长度 2N 的数组中找出重复 N 次的元素
    /*961.在长度2N的数组中找出重复N次的元素已解答简单给你一个整数数组nums,该数组具有以下属性:nums.length==2*n.nums包含n+1个不同的元素nums中恰有一个元素重复n次找出并返回重复了n次的那个元素。示例1:输入:nums=[1,2,3,3]输出:3示例2:输入......
  • 数组
    数组相同类型数据的有序集合,数组也是对象,数组长度一旦确定不可更改。每一个数据被称为一个数组元素,每个数组元素可以通过索引(下标,从0开始)访问必须先声明数组变量,才能使用数组:数据类型[]数组名称;例:Int[]nums;Java用new操作符创建数组,例:nums=newint[10];获取数......
  • 后缀数组【jiangly模板】
    目录后缀数组简介后缀数组可以用于什么场景如何实现后缀数组倍增法求后缀数组\(height\)数组\(LCP\)(最长公共前缀)\(height\)代码模板参考文章后缀数组是一种非常强大的一种处理字符串问题的工具后缀数组简介前置知识:计数排序、基数排序后缀数组(SuffixArray)主要关系到两......
  • 信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组
    PDF文档公众号回复关键字:202407122020CSP-J阅读程序11阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×。除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<cstdlib>02#include<iostream>03usingnamespacestd;0405ch......