leetcode 1562. 查找大小为 M 的最新分组

2023-09-17 22:32:53

给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 。

在从 1 到 n 的每个步骤 i 中(假设二进制字符串和 arr 都是从 1 开始索引的情况下),二进制字符串上位于位置 arr[i] 的位将会设为 1 。

给你一个整数 m ,请你找出二进制字符串上存在长度为 m 的一组 1 的最后步骤。一组 1 是一个连续的、由 1 组成的子串,且左右两边不再有可以延伸的 1 。

返回存在长度 恰好 为 m 的 一组 1 的最后步骤。如果不存在这样的步骤,请返回 -1 。

示例 1:

输入:arr = [3,5,1,2,4], m = 1
输出:4
解释:
步骤 1:“00100”,由 1 构成的组:[“1”]
步骤 2:“00101”,由 1 构成的组:[“1”, “1”]
步骤 3:“10101”,由 1 构成的组:[“1”, “1”, “1”]
步骤 4:“11101”,由 1 构成的组:[“111”, “1”]
步骤 5:“11111”,由 1 构成的组:[“11111”]
存在长度为 1 的一组 1 的最后步骤是步骤 4 。
示例 2:

输入:arr = [3,1,5,4,2], m = 2
输出:-1
解释:
步骤 1:“00100”,由 1 构成的组:[“1”]
步骤 2:“10100”,由 1 构成的组:[“1”, “1”]
步骤 3:“10101”,由 1 构成的组:[“1”, “1”, “1”]
步骤 4:“10111”,由 1 构成的组:[“1”, “111”]
步骤 5:“11111”,由 1 构成的组:[“11111”]
不管是哪一步骤都无法形成长度为 2 的一组 1 。
示例 3:
输入:arr = [1], m = 1
输出:1

示例 4:
输入:arr = [2,1], m = 2
输出:2

提示:
n == arr.length
1 <= n <= 10^5
1 <= arr[i] <= n
arr 中的所有整数 互不相同
1 <= m <= arr.length

思路,可以用合并区间的思路,需要注意的是,区间合并时,只用更新区间最左边和最右边的 index,因为合并区间的中间不会被访问到

class Solution:

    ## 时间复杂度为 O(n), 对相邻的集合进行合并
    def findLatestStep(self, arr: List[int], m: int) -> int:
        if m == len(arr):
            return m
        ### 从后往前检索, 每次合并连续的
        nums = [(-1, -1)] * (len(arr)+1)
        count, res = 0, -1
        for i in range(len(arr)):
            left_1, right_2 = arr[i], arr[i]
            ## 左边处理
            if nums[arr[i]-1][0] != -1:
                left_1, left_2 = nums[arr[i]-1][0], nums[arr[i]-1][1]
                if left_2 - left_1 + 1 == m:
                    count -= 1

            ## 右边
            if arr[i] < len(arr) and nums[arr[i]+1][0] != -1:
                right_1, right_2 = nums[arr[i]+1][0], nums[arr[i]+1][1]
                if right_2 - right_1 + 1 == m:
                    count -= 1
            ## 更新nums 中组中的 最左边和最右边的 index
            ## 因为 [left_1, right_2] 属于同一个分组了, 后续遍历不会访问到其中间的 index, 中间 index 对应的 nums 不用修改
            group_len = right_2 - left_1 + 1
            if group_len == m:
                count += 1
            if count > 0:
                res = i+1
            nums[left_1] = (left_1, right_2)
            nums[right_2] = (left_1, right_2)
        return res
更多推荐

Qt/C++音视频开发55-加密保存到文件并解密播放

一、前言为了保证视频文件的安全性,有时候需要对保存的视频文件加密,然后播放的时候解密出来再播放,只有加密解密的秘钥一致时才能正常播放,用ffmpeg做视频文件的加密保存和解密播放比较简单,基于ffmpeg强大的字典参数设计,在avformat_write_header写入头部数据的时候,可以通过万能的av_dict_s

Redis的String常用命令

Redis基础知识不想key被更改,再key的后面加上nx.eg:127.0.0.1:6379>sets11OK127.0.0.1:6379>setss111OK127.0.0.1:6379>renamenxsss(integer)0--显示的结果为0,表示这个键在的时候,不可修改127.0.0.1:6379>判断命令

脑电相关临床试验及数据分析

临床试验设计作为一个医疗器械公司的开发–>算法–>项目–>产品,还是想在这里记录一下工作。直接开始吧临床试验的设计,主要分为20个部分,分别是封面一、申办者信息二、所有临床试验机构和研究者列表三、临床试验的目的和内容四、临床试验的背景资料五、产品特点、结构组成、工作原理与试验范围六、产品的适应症与禁忌症、注意事项七、总

java给图片添加文字的时候保持印章在最上层

比如生成证书的时候,可能模板图片里面已经有印章了,我们如何把文字添加上去后再把印章盖回去呢?可以通过操纵像素点来完成importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.IOExcept

【mybatis和mybatis-plus】源码分析

mybatis核心类和接口说明Environment环境配置,包含id、TransactionFactory(事务工厂)、DataSourceTransactionFactory有三个实现类,我们与spring整合,默认使用第三个事务工厂TypeAliasRegistry别名映射比如全限定名:parameterType

CentOS安装 Docker 和 docker-compose(V1和V2两个版本)

目录一、安装Docker1、更新docker的yum源为阿里云仓库2、安装必要的一些系统工具3、查看docker-ce版本4、安装指定版本的docker5、切换Dockek镜像下载源(这里使用阿里云镜像)6、启动测试docker7、Docker启动关闭操作8、卸载/更新已经安装的Docker二、安装docker-com

2024字节跳动校招面试真题汇总及其解答(四)

12.Java的类加载机制Java的类加载机制是指将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。类的加载过程分为以下五个阶段:加载:将Class文件从磁盘读入内存,并将其放在方法区中。验证:对Class文件进行

ExcelServer EXCEL服务器使用- 用户、角色权限配置

Excel文件服务器搭建搭建Excel服务器1、登录默认用户名Admin密码32、角色管理添加修改角色角色配置在系统管理->角色.fexm文件夹下可以像修改excel文件一样修改角色3、用户管理添加修改用户用户的修改在系统管理->用户.fexm可以像excel一样编辑用户,注意不要删除列角色编号内容需要与上述角色内容一

Map面试常见问题

Map的特点有哪些?Java中的Map是一种接口,它表示一种将键映射到值的对象。Map的特点主要有以下几点:键的唯一性:每个键在Map中只能出现一次,不能重复。不保证键的顺序:Map不保证键的插入顺序或者遍历顺序。例如,HashMap在迭代时键的顺序与插入顺序可能不一致。可以为null的键和值:Map允许使用null作

语义分割——灰度图像转伪彩色图像

目录检验灰度图检验代码灰度图转伪彩色图代码转换代码使用细则示例转换结果总结检验灰度图制作语义分割数据集或用训练好模型测试图像时,得到的结果是灰度图像,如下:检验代码上面图像灰度值不是全是全为0,灰度范围在[0,1]之间,使用下面脚本测试灰度图像的灰度值是否全为0:importcv2img=cv2.imread("out

【面试题精讲】说一说springboot加载配置文件优先级

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址文章更新计划系列文章地址SpringBoot加载配置文件的优先级是根据不同的位置和命名规则来确定的。下面按照优先级从高到低的顺序来介绍:命令行参数:通过命令行参数指定的配置会覆盖其他配置

热文推荐