当前位置: 首页 > news >正文

剑指offer50_0到n-1中缺失的数字

0到n-1中缺失的数字


一个长度为 n−1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 到 n−1 之内。

在范围 0 到 n−1 的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。

数据范围

1≤n≤1000

样例
输入:[0,1,2,4]输出:3

算法思路(二分查找)
  1. 核心思想
    • 利用有序数组的特性,通过二分查找定位缺失的数字。
    • 关键观察:在无缺失的数组中,数值 nums[i] 应等于索引 i;若 nums[mid] > mid,说明缺失数字在左半部分。
  2. 关键步骤
    • 初始化:左指针 l = 0,右指针 r = nums.size()(注意右边界开区间)。
    • 二分查找
      • nums[mid] > mid,缺失数字在左半部分(r = mid)。
      • 否则,缺失数字在右半部分(l = mid + 1)。
    • 终止条件l == r 时,r 即为缺失的数字。
维度说明公式
时间复杂度二分查找每次将搜索范围减半。 O ( log ⁡ n ) O(\log n) O(logn)
空间复杂度仅使用常数空间(指针变量)。 O ( 1 ) O(1) O(1)

class Solution {
public:int getMissingNumber(vector<int>& nums) {if (nums.empty()) return 0;  // 处理空数组特例int l = 0, r = nums.size();  // 初始化左右指针(右开区间)while (l < r) {              // 二分终止条件int mid = l + r >> 1;    // 等价于 (l + r) / 2if (nums[mid] > mid) r = mid;  // 缺失在左半部分else l = mid + 1;        // 缺失在右半部分}return r;                   // 返回缺失数字}
};
示例演示

输入:nums = [0, 1, 2, 4, 5](缺失 3
二分过程:

  1. 初始范围 [0, 5)
    • mid = 2nums[2] = 2 → 右移 l = 3
  2. 范围 [3, 5)
    • mid = 4nums[4] = 5 > 4 → 左移 r = 4
  3. 范围 [3, 4)
    • mid = 3nums[3] = 4 > 3 → 左移 r = 3
  4. 终止:l = r = 3,返回 3
边界情况处理
输入输出说明
[]0空数组时缺失 0
[0]1缺失 1
[0, 1, 2, 3]4缺失 4(末尾缺失)
[1, 2, 3]0缺失 0(开头缺失)

扩展
  1. 异或解法

    • 利用 a ^ a = 0 的性质,遍历数组和完整序列 0~n 进行异或,最终结果为缺失数字。
    • 时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)
    int res = nums.size();  // 初始化为n(因为循环中少一个数)
    for (int i = 0; i < nums.size(); i++) {res ^= i ^ nums[i];
    }
    return res;
    
  2. 数学求和法

    • 计算 0~n 的和 S = n(n+1)/2,减去数组总和,差值即为缺失数字。
    • 注意可能的整数溢出问题。
http://www.lqws.cn/news/558253.html

相关文章:

  • python -日期与天数的转换
  • autoas/as 工程的RTE静态消息总线实现与端口数据交换机制详解
  • 解决flash-attn安装报错的问题
  • 【C】陷波滤波器
  • 鸿蒙开发:资讯项目实战之底部导航封装
  • MySQL之MVCC实现原理深度解析
  • 类和对象(中)
  • springboot+Vue驾校管理系统
  • 开疆智能ModbusTCP转CClinkIE网关连接台达DVP-ES3 PLC配置案例
  • Java-正则表达式
  • 测量 Linux 中进程上下文切换需要的时间
  • cocos creator 3.8 - 精品源码 - 挪车超人(挪车消消乐)
  • 同步日志系统深度解析【链式调用】【宏定义】【固定缓冲区】【线程局部存储】【RAII】
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • AlphaGenome:基因组学领域的人工智能革命
  • Linux离线搭建Redis (centos7)详细操作步骤
  • 深入解析 Electron 核心模块:构建跨平台桌面应用的关键
  • 《Go语言高级编程》玩转RPC
  • Vue.js 中的 v-model 和 :value:理解父子组件的数据绑定
  • 网络 : 传输层【UDP协议】
  • (线性代数)矩阵的奇异值Singular Value
  • WPS之PPT镂空效果实现
  • 笔记07:网表的输出与导入
  • spring中maven缺少包如何重新加载,报错java: 程序包org.springframework.web.reactive.function不存在
  • FPGA产品
  • 深入理解Java四大引用:强引用、软引用、弱引用与虚引用
  • 2.2.3、CAN总线-位时间特性、中断
  • 开源项目推荐:MCP Registry——管理MCP服务器的利器
  • git 变基:git rebase