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;
    }
};
相关推荐
未知陨落几秒前
LeetCode:68.寻找两个正序数组的中位数
算法·leetcode
努力学习的小廉2 小时前
我爱学算法之—— 模拟(下)
c++·算法
麻雀20253 小时前
一键面试prompt
面试·职场和发展·prompt
海琴烟Sunshine3 小时前
Leetcode 26. 删除有序数组中的重复项
java·算法·leetcode
PAK向日葵3 小时前
【算法导论】NMWQ 0913笔试题
算法·面试
PAK向日葵3 小时前
【算法导论】DJ 0830笔试题题解
算法·面试
PAK向日葵3 小时前
【算法导论】LXHY 0830 笔试题题解
算法·面试
big\hero3 小时前
蓝桥杯13届省题
职场和发展·蓝桥杯
麦麦麦造4 小时前
DeepSeek突然发布 V3.2-exp,长文本能力加强,价格进一步下探
算法
lingran__5 小时前
速通ACM省铜第十七天 赋源码(Racing)
c++·算法