• 编程练习【重复至少 K 次且长度为 M 的模式】


    给你一个正整数数组 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 次。注意,不能计算重叠的重复次数。

    题目来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/detect-pattern-of-length-m-repeated-k-or-more-times
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路:

    题目要求我们找到一个连续出现k次长度m的子数组,我们定义一个index来找到这个子数组的左端点,从m索引开始遍历,判断和前面i-m索引的是否和当前相等,不相等,左端点继续更新,相等判断剩余的子数组是否满足k*m即要求的子数组的长度,如果满足即得到结果。

    代码:

    1. public static boolean containsPattern(int[] arr, int m, int k) {
    2. int index=0;
    3. for(int i=m;i
    4. if(arr[i]!=arr[i-m]) {
    5. index=i-m+1;//找到左端点
    6. }
    7. if(i-index+1==m*k) {
    8. //判断子数组长度
    9. return true;
    10. }
    11. }
    12. return false;
    13. }

  • 相关阅读:
    02UEc++【打飞艇:无人机运动】
    Kubernetes简略架构
    买卖股票的最佳时机 II
    03Redis-五大基本数据类型
    35岁程序员被裁员,这半年他的故事
    [附源码]SSM计算机毕业设计作业自动评阅系统JAVA
    一文搞懂 ARM 64 系列: 寄存器
    Vant和ElementPlus在vue的hash模式的路由下路由离开拦截使用Dialog和MessageBox失效
    Makefile+OpenOCD开发STM32
    2-10.基金管理人的内部控制
  • 原文地址:https://blog.csdn.net/weixin_52237268/article/details/131142946