写点什么

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

  • 2024-07-13
    北京
  • 本文字数:1065 字

    阅读完需:约 3 分钟

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))}
复制代码



发布于: 刚刚阅读数: 5
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i._福大大架构师每日一题_福大大架构师每日一题_InfoQ写作社区