【LeetCode每日一题】——1539.第 k 个缺失的正整数

news2024/12/26 11:39:38

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【题目提示】
  • 八【题目进阶】
  • 九【时间频度】
  • 十【代码实现】
  • 十一【提交结果】

一【题目类别】

  • 二分查找

二【题目难度】

  • 简单

三【题目编号】

  • 1539.第 k 个缺失的正整数

四【题目描述】

  • 给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。
  • 请你找到这个数组里第 k 个缺失的正整数。

五【题目示例】

  • 示例 1:

    • 输入:arr = [2,3,4,7,11], k = 5
    • 输出:9
      • 解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,…] 。第 5 个缺失的正整数为 9 。
  • 示例 2:

    • 输入:arr = [1,2,3,4], k = 2
    • 输出:6
      • 解释:缺失的正整数包括 [5,6,7,…] 。第 2 个缺失的正整数为 6 。

六【解题思路】

  • 利用二分查找的思想,不过找的不是目标值,而是缺失数字数量大于k的最小位置
  • 那么如何计算每个位置的缺失数字数量呢?可以用公式: a r r [ m i d ] − m i d − 1 arr[mid] - mid - 1 arr[mid]mid1计算,其中 m i d mid mid就是二分查找的中间值
  • 如果缺失数字数量大于或等于 k k k,说明需要向左查找,反之需要向右查找
  • 当找到缺失数字数量大于 k k k的最小位置后(用 l e f t left left表示),就可以计算第 k k k个缺失的数字了
  • a r r [ l e f t − 1 ] − ( l e f t − 1 ) − 1 arr[left - 1] - (left - 1) - 1 arr[left1](left1)1表示找到的位置缺失的数字数量, k − ( a r r [ l e f t − 1 ] − ( l e f t − 1 ) − 1 ) k - (arr[left - 1] - (left - 1) - 1) k(arr[left1](left1)1)就表示从 a r r [ l e f t − 1 ] arr[left - 1] arr[left1]开始还缺几个数字,最后再加上 a r r [ l e f t − 1 ] arr[left - 1] arr[left1]就是第 k k k个缺失的数字,这里 l e f t left left减一就是缺失数字数量和大于 k k k的最小位置,所以最后的计算公式就是 k − ( a r r [ l e f t − 1 ] − ( l e f t − 1 ) − 1 ) + a r r [ l e f t − 1 ] k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1] k(arr[left1](left1)1)+arr[left1]
  • 另外还需要注意边界条件,如果数组的第一个数字都大于 k k k,说明第 k k k个缺失的数字就是 k k k,直接返回 k k k就行
  • 最后返回结果即可

七【题目提示】

  • 1 < = a r r . l e n g t h < = 1000 1 <= arr.length <= 1000 1<=arr.length<=1000
  • 1 < = a r r [ i ] < = 1000 1 <= arr[i] <= 1000 1<=arr[i]<=1000
  • 1 < = k < = 1000 1 <= k <= 1000 1<=k<=1000
  • 对于所有 1 < = i < j < = a r r . l e n g t h 的 i 和 j 满足 a r r [ i ] < a r r [ j ] 对于所有 1 <= i < j <= arr.length 的 i 和 j 满足 arr[i] < arr[j] 对于所有1<=i<j<=arr.lengthij满足arr[i]<arr[j]

八【题目进阶】

  • 你可以设计一个时间复杂度小于 O(n) 的算法解决此问题吗?

九【时间频度】

  • 时间复杂度: O ( l o g n ) O(logn) O(logn),其中 n n n为数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

十【代码实现】

  1. Java语言版
class Solution {
    public int findKthPositive(int[] arr, int k) {
        if(arr[0] > k){
            return k;
        }
        int left = 0;
        int right = arr.length;
        while(left < right){
            int mid = (left + right) / 2;
            int dif = arr[mid] - mid - 1;
            if(dif >= k){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1];
    }
}
  1. C语言版
int findKthPositive(int* arr, int arrSize, int k)
{
    if(arr[0] > k)
    {
        return k;
    }
    int left = 0;
    int right = arrSize;
    while(left < right)
    {
        int mid = (left + right) / 2;
        int dif = arr[mid] - mid - 1;
        if(dif >= k)
        {
            right = mid;   
        }
        else
        {
            left = mid + 1;
        }
    }
    return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1];
}
  1. Python版
class Solution:
    def findKthPositive(self, arr: List[int], k: int) -> int:
        if arr[0] > k:
            return k
        left = 0
        right = len(arr)
        while left < right:
            mid = (left + right) // 2
            dif = arr[mid] - mid - 1
            if dif >= k:
                right = mid
            else:
                left = mid + 1
        return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1]

十一【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于VSCode的三个配置文件

关于VSCode的三个配置文件 若要使用VSCode来开发C程序&#xff0c;则应该了解以下三种配置文件&#xff0c;分别为&#xff1a; tasks.json&#xff1a;编译器相关的配置文件。比如&#xff0c;设置编译指令。 注&#xff1a;对于复杂的编译任务&#xff08;涉及多个源文件的编…

《Linux运维总结:Centos7.6部署redis6.2.8哨兵集群》

一、部署redis服务 1.1、环境信息 环境信息如下&#xff1a; 主机IP操作系统Redis版本CPU架构端口角色192.168.1.191Centos7.66.2.8x86_647001master192.168.1.192Centos7.66.2.8x86_647002slave192.168.1.193Centos7.66.2.8x86_647003slave192.168.1.191Centos7.66.2.8x86_6…

【嵌入式·单片机】老生常谈:学习单片机和嵌入式是否需要学习算法?

文章目录前言什么是算法嵌入式是否需要算法如何学习算法参考资料前言 刚学习单片机或嵌入式的同学可能会听说过「算法」这个词&#xff0c;部分电子信息类专业的同学也会在自己的培养计划上看到《数据结构与算法》这门课程&#xff0c;这个时候我们可能会感到疑惑&#xff0c;…

九、Java 16 新特性

九、Java 16 新特性 JDK 16 在 2021 年 3 月 16 号发布&#xff01;根据发布的规划&#xff0c;这次发布的 JDK 17 是一个长期维护的版本&#xff08;LTS)。Java 16 提供了数千个性能、稳定性和安全性更新&#xff0c;以及 17 个 JEP&#xff08;JDK 增强提案&#xff09;&…

特征工程资料整理,如何从数据中挖掘特征

特征工程资料整理&#xff0c;如何从数据中挖掘特征一、特征工程是什么二、探索性数据分析EDA参考资料&#xff1a;1. pandas_profiling【推荐】2. Sweetviz3. pandasgui4.D-tale【推荐】结论三、特征处理参考资料&#xff1a;1. 数值特征⭐️⭐️⭐️⭐️⭐️数值特征小结&…

用于高精度干涉仪的奇特量子效应

使用物质波放大、跟踪加速度&#xff0c;以前从未以便携式形式实现。&#xff08;图片来源&#xff1a;网络&#xff09; 来自法国的一组研究人员开发了第一个三向混合量子惯性传感器&#xff0c;它可以在不使用卫星信号的情况下测量加速度。这个突破性设备的核心是“物质波干涉…

传统目标跟踪——MeanShift算法

目录 一、均值漂移&#xff08;MeanShift&#xff09; 二、流程 三、代码 3.1 meanshift&#xff0b;固定框的代码 3.2 优化&#xff1a;meanshift鼠标选择 3.3 meanshift自己实现函数 四、补充知识 4.1 直方图 4.2 归一化 4.3 直方图反投影 一、均值漂移&#xff08;…

Maven 教程

Maven 教程 Maven 翻译为"专家"、“内行”&#xff0c;是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型&#xff08;缩写&#xff1a;POM&#xff09;概念&#xff0c;Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 Maven 是一…

手把手教你阿里云服务器的购买及环境搭建

1.服务器相关 程序员都需要一个自己的服务器! 用于发布自己的网站和项目&#xff01;用于操作系统的练习&#xff01;将自己的远程仓库、远程数据库、远程tomcat… 搭建在服务器上&#xff01;用于Linux进行任意的环境部署操作&#xff01; 服务器如何购买 若果你没超过24岁&am…

【Bp2Lua】多返回值和Out参数说明

【Bp2Lua】多返回值和Out参数说明 这块比较繁琐&#xff0c;有四部分需要了解&#xff1a; U蓝图LuaUnLua 最后再解释 Bp2Lua 如何处理&#xff0c;以及后续潜在的风险 Bp2Lua 如何处理 先说结论 统一当作多返回值返回特殊处理了 out参数 不在参数列表最后的情况&#xf…

分布式理论之分布式锁

写在前面 在分布式理论之分布式互斥 一文中我们分析了分布式环境中的分布式互斥问题,其中解决该问题有如下的三种方案&#xff1a; 1&#xff1a;集中式算法 2&#xff1a;分布式算法 3&#xff1a;令牌环算法而本文要分析的分布式锁&#xff0c;就是其中的算法1&#xff0c;…

折腾了我一周,原来Netty网络编程就是这么个破玩意儿!!!

1、阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在通道中没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了&#xff0c;暂停期间不会占用 cpu&#xff0c;但线程相当于闲置 单线…

flowable学习笔记(四):动态多实例

1.定义流程模板 【测试用户任务多实例】任务节点配置了以下属性&#xff1a; 集合(多实例)&#xff1a;userList。这个创建流程实例时入参需要加上这个参数。 元素变量(多实例)&#xff1a;user。工作流创建多实例时会将集合(多实例)的值拆分成元素变量(多实例)&#xff0c;这个…

Git复习,GitHub\Gitee的使用,IDEA集成Git

今天想把自己的课设上传到GitHub&#xff0c;因为长久不用&#xff0c;Git的命令忘得差不多了&#xff0c;所以今天把Git重新学一遍。 文章目录Git的介绍Git的安装Git的常用命令工作机制常用命令用户签名初始化本地库查看本地库状态添加暂存区提交本地库查看引用日志信息修改文…

Python常用函数笔记汇总2

1.分组汇总groupby 2.计算空值 # py计算空值 data.isnull().sum(axis0) data.notnull().sum(axis0)# py去重计数 data_op[id_num_op].value_counts().size data_op[id_num_op].size3.保留两位小数 # predict_proba保留两位小数 gnb GaussianNB() pre gnb.fit(X_train,y_tr…

pytest-日志配置

如果想要在run测试用例时&#xff0c;打印出由python的logging的日志&#xff0c;可以在pytest中进行相应的配置 pytest可以将日志输出到控制台或者文件中&#xff0c;分别对应不同的配置项 pytest的日志配置文件主要在pytest.ini文件中进行配置&#xff0c;包括配置日志的格式…

ARM64内存虚拟化分析(5)内存布局更新

1 添加MR 创建的MR需要通过函数memory_region_add_subregion()添加到系统中&#xff0c;提交MR&#xff0c;并最终往KVM提交内存的变化。 过程如下&#xff1a; 将mr设置为subregion的container&#xff1b;设置subregion在虚拟机中的物理地址&#xff1b;调用memory_region_t…

FOHEART H1数据手套_Unity3D SDK开发

本教程介绍使用FOHEART H1数据手套在Unity3D中&#xff0c;显示每段骨骼的位置与旋转信息。 需要准备的软硬件&#xff1a; 1、FOHEART H1数据手套 2、MotionVenus客户端 3、Unity3D软件 4、开发包MotionVenus_U3DPlugin_v2.0_H1GloveDev_SDKTest.unitypackage 1、连接数…

HFSS学习笔记

以下所有操作&#xff0c;都是基于2022版本的HFSS。一、HFSS solution模式选择位置&#xff1a;HFSS-Solution type类型表格。二、单位设置位置&#xff1a;Modeler-Units点击后&#xff0c;通常选用单位为&#xff1a;mm三、绘制物体点击红圈1的draw&#xff0c;右侧有些形状可…

MCU-51:单片机实时时钟

目录一、什么是时钟1.1 实时时钟1.2 时序二、DS1302实时时钟2.1 DS1302介绍2.2 引脚定义和应用电路三、代码演示3.1 数字时钟3.2 DS1302可调时钟注意&#xff1a;一定要看一、什么是时钟 1.1 实时时钟 real time clock&#xff0c;真实时间&#xff0c;就是所谓的xx年x月x日x…