【Leetcode】1566. Detect Pattern of Length M Repeated K or More Times

题目地址:

https://leetcode.com/problems/detect-pattern-of-length-m-repeated-k-or-more-times/description/

给定一个长 n n n数组 a a a,和一个长度 m m m和次数 k k k m ≥ 1 m\ge 1 m1并且 k > 1 k>1 k>1。问是否存在一个长 m m m的子数组连续出现了 k k k次,并且这 k k k次出现没有交集。

遍历数组。设某个子数组从下标 i i i开始连续出现了 k k k次,如果有一个计数器 c c c每当 a [ i ] = a [ i + m ] a[i]=a[i+m] a[i]=a[i+m]的时候就加 1 1 1否则清零,在遍历到 i i i的之前为 0 0 0,那么遍历到 i + ( k − 1 ) m − 1 i+(k-1)m-1 i+(k1)m1的时候计数器恰好为 ( k − 1 ) m (k-1)m (k1)m;反过来也是对的,如果计数器从 0 0 0一路递增到 ( k − 1 ) m (k-1)m (k1)m,那么遍历的地方就存在 k k k次连续出现的相同的子数组。代码如下:

class Solution {
 public:
  bool containsPattern(vector<int>& a, int m, int k) {
    int cnt = 0;
    for (int i = 0; i + m < a.size(); i++) {
      if (a[i] == a[i + m]) {
        if (++cnt == (k - 1) * m) return true;
      } else
        cnt = 0;
    }
    return false;
  }
};

时间复杂度 O ( n − m ) O(n-m) O(nm),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值