剑指 Offer 53 - II. 0~n-1中缺失的数字

news2024/11/17 23:25:05

摘要

剑指 Offer 53 - II. 0~n-1中缺失的数字

一、二分法

1.1 二分法分析

排序数组中的搜索问题,首先想到 二分法 解决。
根据题意,数组可以按照以下规则划分为两部分。

  • 左子数组: nums[i]=i;
  • 右子数组: nums[i]≠i;

缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素”。

图片.png

算法解析:

  • 初始化: 左边界 i=0i=0 ,右边界 j=len(nums)−1j=len(nums)−1 ;代表闭区间 [i,j]。
  • 循环二分: 当 i≤ji≤j 时循环 (即当闭区间 [i,j] 为空时跳出) ;
    • 计算中点 m=(i+j)>> 1,其中 为向下取整除法;
    • 若 nums[m]=m ,则 “右子数组的首位元素” 一定在闭区间 [m+1,j] 中,因此执行 i=m+1;
    • 若 nums[m]≠m ,则 “左子数组的末位元素” 一定在闭区间 [i,m−1] 中,因此执行 j=m−1j=m−1;
  • 返回值:跳出时,变量i和j分别指向 “右子数组的首位元素” 和 “左子数组的末位元素” 。因此返回 i 即可。

1.2 复杂度分析

  • 时间复杂度 O(logN): 二分法为对数级别复杂度。
  • 空间复杂度 O(1):几个变量使用常数大小的额外空间。

1.3 code 示例

public int missingNumber(int[] nums) {
    int i = 0;
    int j = nums.length - 1;
    while (i <= j) {
        int m = (i + j) >> 1;
        if (nums[m] == m) {
            i = m + 1;
        } else {
            j = m - 1;
        }
    }
    return i;
}

二、其他方法

2.1 哈希集合分析

最直观的方法是使用哈希集合。

首先遍历数组 nums,将数组中的每个元素加入哈希集合,然后依次检查从 0到 n−1的每个整数是否在哈希集合中,不在哈希集合中的数字即为缺失的数字。由于哈希集合的每次添加元素和查找元素的时间复杂度都是 O(1),因此总时间复杂度是 O(n)。

图片.png

2.2 复杂度分析

  • 时间复杂度:O(n),其中 n是数组 nums的长度加 1。遍历数组 nums 将元素加入哈希集合的时间复杂度是 O(n),遍历从 0 到 n−1 的每个整数并判断是否在哈希集合中的时间复杂度也是 O(n)。

  • 空间复杂度:O(n),其中 n 是数组 nums的长度加 1。哈希集合中需要存储 n−1个整数

2.3 code 示例

class Solution {
    public int missingNumber(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int n = nums.length + 1;
        for (int i = 0; i < n - 1; i++) {
            set.add(nums[i]);
        }
        int missing = -1;
        for (int i = 0; i <= n - 1; i++) {
            if (!set.contains(i)) {
                missing = i;
                break;
            }
        }
        return missing;
    }
}

使用直接遍历方式来查找缺失的数字。

class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length + 1;
        for (int i = 0; i < n - 1; i++) {
            if (nums[i] != i) {
                return i;
            }
        }
        return n - 1;
    }
}

博文参考

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

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

相关文章

Eolink 11月企业与产品动态速览!

本月&#xff0c;Eolink IDEA 插件 “Eolink ApiKit” 最新版本 1.1.3 发布&#xff0c;可进行方法 API 解析的插件&#xff0c;可自动生成注释&#xff0c;可分析方法出入参等。 此外&#xff0c;Eolink 再获多项荣誉与认证&#xff0c;持续行业领先&#xff01;一起来看看 11…

我今天吃了SHI,请对下联

1. 跨平台终端 Tabby(前身是 Terminus) 是一个可高度配置的终端模拟器和 SSH 或串口客户端&#xff0c;支持 Windows&#xff0c;macOS 和 Linux。 还有一些功能比较常见和易于使用的&#xff1a; 集成了 SSH&#xff0c;Telnet 客户端和连接管理器&#xff0c;可以在 SSH 会…

JAVA SCRIPT设计模式--行为型--设计模式之Mediator中介者模式(17)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

图的初体验

最近周赛有两个差不多的题目&#xff0c;都是关于图的&#xff0c;之前也没有怎么练过关于图的题目&#xff0c;来记录一下。 T1 力扣T320周赛&#xff1a;T3&#xff1a;到达首都的最少油耗 class Solution {//结果long result ;public long minimumFuelCost(int[][] roads…

【推免攻略】四.2021年北交计算机学院夏令营、预推免保研经验

欢迎订阅本专栏&#xff1a;《北交计算机保研经验》 订阅地址&#xff1a;https://blog.csdn.net/m0_38068876/category_10779337.html 【推免攻略】一.北交计算机学院夏令营、预推免攻略【推免攻略】二.联系导师的前期准备及注意事项【推免攻略】三.2020年北交计算机学院夏令营…

如何能成为测试老大?先搞懂项目中的敏捷开发模式

1 什么是敏捷开发&#xff1f; 1、敏捷开发是以用户的需求进化为核心&#xff0c;采取迭代、循序渐进的方式来 进行软件项目的开发。 2、即将项目切分为多个子项目&#xff0c;每个子项目单独发布&#xff0c;保证软件较早可用。 3、及时收集用户反馈&#xff0c;调整未发布…

线性回归线性关系、非线性关系、常见函数导数、损失函数与优化算法、正规方程与单变量函数梯度下降、多变量函数梯度下降

一、线性回归概述 线性回归(Linear regression)&#xff1a;是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多于一个自变量情况的叫做多元回归 特征值与目…

机器学习笔记之受限玻尔兹曼机(五)基于含隐变量能量模型的对数似然梯度

机器学习笔记之受限玻尔兹曼机——基于含隐变量能量模型的对数似然梯度引言回顾&#xff1a;包含配分函数的概率分布受限玻尔兹曼机——场景构建对比散度基于含隐变量能量模型的对数似然梯度引言 上一节介绍了对比散度(Constractive Divergence)思想&#xff0c;本节将介绍基于…

制造型企业如何进行多项目管理?这篇文章说清楚了

受经济全球化与科技迅速发展的影响&#xff0c;我国很多企业早已进入了多项目管理模式。多项目管理是从企业整体出发&#xff0c;动态选择不具有类似性的项目&#xff0c;对企业所拥有的或可获得的生产要素和资源进行优化组合&#xff0c;有效、最优地分配企业资源&#xff0c;…

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球 产品描述&#xff1a;通过特异性识别作用在表面等离子体共振传感器的金膜表面构建了伴刀豆球蛋白A/葡聚糖修饰金纳米颗粒自组装膜 中文名称&#xff1a;葡聚糖修饰金纳米颗粒 英文名称&#xff1…

CMAKE编译知识

1&#xff0c;Ubuntu安装了cmake之后&#xff0c;直接输入指令查看版本。cmake -version 我这里的版本为3.16.3 2&#xff0c;使用visual studio里面创建一个CMake项目是最快可以看到的。但是一般无法理解。所以我找了网上资料。根据网上所说和自己再试错下。初步了解了cmake…

[附源码]JAVA毕业设计微博网站(系统+LW)

[附源码]JAVA毕业设计微博网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

IAA游戏市场规模已达百亿,如何防范游戏安全问题?

近年来&#xff0c;移动休闲游戏市场发展速度迅猛&#xff0c;伽马数据发布的《2022年休闲游戏发展报告》称&#xff0c;2022年第一季度移动游戏下载量TOP200榜单中&#xff0c;休闲类游戏占比已达45%。 2022年第一季度下载量TOP200移动游戏占比情况丨数据来源伽马数据 相比IA…

MMCV学习——基础篇4(Hook)| 八千字:从设计模式到源码解读

MMCV学习——基础篇4&#xff08;Hook&#xff09; Hook 机制在MMCV的各个开源库中应用的十分广泛&#xff0c;它主要用于管理和扩展Runner的整个生命周期。通过Hook机制在Runner的各个生命周期节点调用自定义的函数&#xff0c;可以实现丰富的定制功能。 文章目录MMCV学习——…

【C语言航路】第八站:调试(第一幕)

前言 调试的这一站&#xff0c;对于市面上大部分的书籍都是缺失的&#xff0c;然而调试这个内容是非常重要的&#xff0c;尤其是在数据结构部分&#xff0c;将会频繁的使用&#xff0c;这也为我们后面讲解数据结构做一个铺垫。同时&#xff0c;在以后未来工作的时候&#xff0…

Generative Cooperative Learning for Unsupervised Video Anomaly Detection

介绍 在现实世界中&#xff0c;基于学习的异常检测任务极具挑战性&#xff0c;这主要是因为此类事件很少发生。由于这些事件的无约束性质&#xff0c;这一挑战进一步加剧。因此&#xff0c;获取足够的异常示例是相当麻烦的&#xff0c;而人们可以安全地假设&#xff0c;将永远…

Xcode9 无证书真机调试​

写在前面​ 公司分配了新的测试机,证书99台名额已满,所以上网找教程,学习了一下如何使用Xcode无证书进行真机调试。​ 一. 创建证书​ 1. 运行Xcode&#xff0c; Xcode–》Preference–》添加账号&#xff08;能在appstore下载的账号&#xff09;​ 2. 选中刚才添加的AppleID…

光华股份在深交所上市:市值突破51亿元,前三季度收入约10亿元

12月8日&#xff0c;浙江光华科技股份有限公司&#xff08;下称“光华股份”&#xff0c;SZ:001333&#xff09;在深圳证券交易所主板上市。本次上市&#xff0c;光华股份的发行价格27.76元/股&#xff0c;发行数量为3200万股&#xff0c;募资总额约为8.88亿元&#xff0c;扣除…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK11特性讲解】

JDK各个版本特性讲解-JDK11特性 lecture&#xff1a;波哥 一、JAVA11 概述 2018年9月26日,Oracle官方发布JAVA11.这是JAVA大版本周期变化后的第一个长期支持版本,非常值得关注.最新发布的JAVA11将带来ZGC HttpClient等重要特性,一共17个需要我们关注的JEP,参考文档http://openj…

Docker_简介、优势、架构、常用命令

Docker简介 Docker是什么 Docker就是将环境在不消耗大量资源的情况下复制出一个一样的环境 一次镜像&#xff0c;处处运行 内核级虚拟化 基于GO语言实现的开源项目 解决运行环境和配置问题的软件容器 容器与虚拟机比较 虚拟机是模拟的整套操作系统&#xff0c;会有资源占用…