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

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

  1. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  2. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  3. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  4. 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,

    转自:http://www.cnblogs.com/ranranblog/p/5845010.html 风口之下,猪都能飞.当今中国股市牛市,真可谓“错过等七年”. 给你一个回顾历史的机会,已知一支股 ...

  5. 【C语言】在两个数成对出现的数组中找到一个单独的数。

    //在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) ...

  6. 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)

    我没有实现时间复杂度为O(n)的算法. 思路:从第一数开始,onelist[0]:onelist[0]+onelist[1]:这样依次推算出每个子数组的sum值.和max进行比较.最后得到max值. ...

  7. [jstips]向数组中插入一个元素

    向现有数组中插入一个元素是经常会见到的一个需求.你可以: 使用push将元素插入到数组的尾部: 使用unshift将元素插入到数组的头部: 使用splice将元素插入到数组的中间: 上面那些方法都是常 ...

  8. C#如何删除数组中的一个元素

    C#如何删除数组中的一个元素,剩余的元素组成新数组,数组名不变double[] arr = new double[n];需要删除的是第m+1个数据arr[m]求新数组arr.(新数组arr包含n-1个 ...

  9. js数组合并(一个数组添加到另一个数组里面)方法

    js定义两个数组. var arrA=[1,2,3]; var arrB=[4,5,6]; 要实现[1,2,3,4,5,6],如果直接arrA.push(arrB); 则arrB只会作为了arrA的一 ...

  10. 七、如何在Java中高效检查一个数组是否含有一个值

    如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非 ...

随机推荐

  1. JDK源码阅读-------自学笔记(七)(二维数组的浅析)

    实际开发中一般最多使用到二维数组,再高很少使用 二维数组很少用,实际开发中会使用容器代替使用 1.创建二维数组 1 // 二维数组初始化 2 int[][] secondDimensional = n ...

  2. 用 C 语言开发一门编程语言 — 交互式解释器

    目录 文章目录 目录 前言 环境 编译型 vs 解释型 实现交互式解释器 使用 GNU Readline 函数库 前言 通过开发一门类 Lisp 的编程语言来理解编程语言的设计思想,本实践来自著名的& ...

  3. 30分钟带你搞定Dokcer部署Kafka集群

    docker网络规划 docker network create kafka-net --subnet 172.20.0.0/16 docker network ls zookeeper1(172.2 ...

  4. 定了!AIRIOT新品发布会,6月6日北京见。

    随着物联网.大数据.AI技术的成熟和演进,智能物联网技术正在加速.深入渗透至各行业应用. AIRIOT物联网平台作为赋能数字经济发展和产业转型的数字基座,由航天科技控股集团股份有限公司(股票代码:00 ...

  5. vue3:modal组件开发

    项目环境 @vue/cli 4.5.8 最终效果 需求分析 显示/隐藏 点击遮罩层能否关闭 宽度和zIndex自定义 标题栏 -显示标题和关闭按钮 主体 底部 -内置取消和确定功能 前置知识 tele ...

  6. RBD与Cephfs

    目录 1. RBD 1. RBD特性 2. 创建rbd池并使用 2.1 创建rbd 2.2 创建用户 2.3 下发用户key与ceph.conf 2.4 客户端查看pool 2.5 创建rbd块 2. ...

  7. 一个IDEA界面如何同时打开多个项目

    第一步:先导入其中一个工程 第二步:点击File->Project Structure 第三步:导入模块 最后点击Apply即可完成一个IDEA界面同时打开多个项目的需求.

  8. SwiftUI(一)- VStack、HStack、ZStack布局

    SwiftUI是什么 懒得写,直接找了一篇博客: 初识 SwiftUI 三种布局 SwiftUI包括三种布局: VStack: 纵向布局,默认居中对齐 HStack: 横向布局,默认居中对齐 ZSta ...

  9. 如何使用Node.js、TypeScript和Express实现RESTful API服务

    Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Express是一个保持最小规模的灵 ...

  10. 从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

    本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...