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;
    }
};
相关推荐
xl.liu20 分钟前
零售行业仓库商品数据标记
算法·零售
confiself24 分钟前
通义灵码分析ms-swift框架中CHORD算法实现
开发语言·算法·swift
做怪小疯子26 分钟前
LeetCode 热题 100——二叉树——二叉树的层序遍历&将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
CoderYanger38 分钟前
递归、搜索与回溯-记忆化搜索:38.最长递增子序列
java·算法·leetcode·1024程序员节
面试鸭44 分钟前
科大讯飞,你好大方。。。
java·计算机·职场和发展·求职招聘
xlq223222 小时前
22.多态(下)
开发语言·c++·算法
CoderYanger2 小时前
C.滑动窗口-越短越合法/求最长/最大——2958. 最多 K 个重复元素的最长子数组
java·数据结构·算法·leetcode·哈希算法·1024程序员节
却话巴山夜雨时i3 小时前
394. 字符串解码【中等】
java·数据结构·算法·leetcode
haing20193 小时前
使用黄金分割法计算Bezier曲线曲率极值的方法介绍
算法·黄金分割