LeetCode - LCR 173. 点名

题目

LCR 173. 点名 - 力扣(LeetCode)

思路

首先对数组进行排序,使学号按顺序排列

在排序后的数组中,如果没有缺失的学号,那么每个元素应该等于其索引值

使用二分查找找到第一个不等于其索引的元素位置:

  • 如果 records[mid] == mid,说明缺失的数字在右半部分
  • 如果 records[mid] > mid,说明缺失的数字在左半部分(包括mid)

循环结束时,left 指向的是第一个不等于其索引的位置,即缺失的学号

时间复杂度:O(n log n),主要是排序的时间复杂度

空间复杂度:O(1),只使用常数额外空间

读者可能出现的错误写法

cpp 复制代码
class Solution {
public:
    int takeAttendance(vector<int>& records) {
        int left = 0;
        int right = records.size()-1;

        while(left < right)
        {
            int mid = left + (right - left)/2;

            if(records[mid] == mid)
            {
                left = mid+1;
            }
            else
            {
                right = mid;
            }
        }

        return right;
    }
};

边界情况处理:

你的代码没有处理缺失的是最后一个数字(即n-1)的情况。循环结束后,如果 records[right] == right,说明缺失的是最后一个数字。

正确写法

cpp 复制代码
class Solution {
public:
    int takeAttendance(vector<int>& records) {
        int left = 0;
        int right = records.size()-1;

        while(left < right)
        {
            int mid = left + (right - left)/2;

            if(records[mid] == mid)
            {
                left = mid+1;
            }
            else
            {
                right = mid;
            }
        }
        if(records[left] == right)
        {
            return right+1;
        }
        return right;
    }
};
相关推荐
JAVA学习通16 小时前
美团AI面试 实习一面面经
面试·职场和发展
小许同学记录成长17 小时前
三维重建技术文档
算法·无人机
小为资料库18 小时前
2026年5月16日教资面试真题汇总(中小幼各科全)
面试·职场和发展
小O的算法实验室18 小时前
2026年ASOC,基于多目标优化去噪双存档进化算法+路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
2601_9545267519 小时前
逆向解析Temu底层动销算法:基于API高并发轮询与全域存量透视的自动化架构重构
算法·架构·自动化
Σίσυφος190019 小时前
数据标准化(拟合的时候使用非常重要)
人工智能·算法
knight_9___19 小时前
大模型project面试7
人工智能·python·算法·面试·大模型·agent
NashSKY20 小时前
EM 算法完整推导与本质剖析
算法·机器学习·概率论
foundbug99921 小时前
MATLAB实现:基于图像对比度和波段相关性的高光谱波段选择算法
开发语言·算法·matlab
嘿嘿嘿x321 小时前
Linux-实践
linux·运维·算法