题目地址:
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 m≥1并且 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+(k−1)m−1的时候计数器恰好为 ( k − 1 ) m (k-1)m (k−1)m;反过来也是对的,如果计数器从 0 0 0一路递增到 ( k − 1 ) m (k-1)m (k−1)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(n−m),空间 O ( 1 ) O(1) O(1)。