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完整代码如下:
代码语言:javascript复制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))
}