LeetCode-1566. 重復至少 K 次且長度為 M 的模式【數組 枚舉】
- 題目描述:
- 解題思路一:題意就是找出長度為m且連續重復k次的子數組。解題思路就是暴力枚舉加剪枝。
- 解題思路二:思路差不多
- 解題思路三:0
題目描述:
給你一個正整數數組 arr,請你找出一個長度為 m 且在數組中至少重復 k 次的模式。
模式 是由一個或多個值組成的子數組(連續的子序列),連續 重復多次但 不重疊 。 模式由其長度和重復次數定義。
如果數組中存在至少重復 k 次且長度為 m 的模式,則返回 true ,否則返回 false 。
示例 1:
輸入:arr = [1,2,4,4,4,4], m = 1, k = 3
輸出:true
解釋:模式 (4) 的長度為 1 ,且連續重復 4 次。注意,模式可以重復 k 次或更多次,但不能少于 k 次。
示例 2:
輸入:arr = [1,2,1,2,1,1,1,3], m = 2, k = 2
輸出:true
解釋:模式 (1,2) 長度為 2 ,且連續重復 2 次。另一個符合題意的模式是 (2,1) ,同樣重復 2 次。
示例 3:
輸入:arr = [1,2,1,2,1,3], m = 2, k = 3
輸出:false
解釋:模式 (1,2) 長度為 2 ,但是只連續重復 2 次。不存在長度為 2 且至少重復 3 次的模式。
示例 4:
輸入:arr = [1,2,3,1,2], m = 2, k = 2
輸出:false
解釋:模式 (1,2) 出現 2 次但并不連續,所以不能算作連續重復 2 次。
示例 5:
輸入:arr = [2,2,2,2], m = 2, k = 3
輸出:false
解釋:長度為 2 的模式只有 (2,2) ,但是只連續重復 2 次。注意,不能計算重疊的重復次數。
提示:
2 <= arr.length <= 100
1 <= arr[i] <= 100
1 <= m <= 100
2 <= k <= 100
解題思路一:題意就是找出長度為m且連續重復k次的子數組。解題思路就是暴力枚舉加剪枝。
class Solution:def containsPattern(self, arr: List[int], m: int, k: int) -> bool:def judge_same(i,j,m):for x,y in zip(range(i,i+m,1),range(j,j+m,1)):if arr[x] != arr[y]: return Falsereturn Truefor i in range(len(arr)-m):flag = 0for j in range(i+m,len(arr)-m+1,m):if j>(i+(k-1)*m): breakif judge_same(i,j,m): flag += 1continueif flag>=k-1: return True return False
時間復雜度:O(nmk)
空間復雜度:O(1)
解題思路二:思路差不多
class Solution:def containsPattern(self, arr: List[int], m: int, k: int) -> bool:n = len(arr)for l in range(n - m * k + 1):offset = 0while offset < m * k:if arr[l + offset] != arr[l + offset % m]:breakoffset += 1if offset == m * k:return Truereturn False
時間復雜度:O(nmk)
空間復雜度:O(1)
解題思路三:0