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;
    }
};
相关推荐
森焱森1 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack3 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客4 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠4 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988945 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼5 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield6 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦6 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl6 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
small_wh1te_coder6 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c