模块三:二分——LCR. 173.点名

文章目录

题目描述

题目链接:LCR. 173.点名

关于这道题中,时间复杂度为 O(N) 的解法有很多种,⽽且也是⽐较好想的,这⾥就不再赘述。本题只讲解⼀个最优的⼆分法和一个暴力版本,来解决这个问题。

算法原理

暴力查找

遍历一遍数组,寻找recordsi != i的位置,返回下标i即可,循环结束还没有返回结果就是数组的长度了。

二分查找

在这个升序的数组中,我们发现:

  • 在第⼀个缺失位置的左边,数组内的元素都是与数组的下标相等的;
  • 在第⼀个缺失位置的右边,数组内的元素与数组下标是不相等的。

因此,我们可以利⽤这个「⼆段性」,来使⽤「⼆分查找」算法。
PS:这里有个细节问题是当答案为数组长度时,即只有两个数时,根据判断条件left会等于recordsright,这个答案显然是错误的,所以需要处理一下。

代码实现

暴力查找

cpp 复制代码
class Solution {
public:
    int takeAttendance(vector<int>& records) {
        for(int i = 0;i < records.size();i++){
            if(records[i] != i)
                return i;
        }
        return records.size();
    }
};

二分:C++

cpp 复制代码
class Solution {
public:
    int takeAttendance(vector<int>& records) {
        int left = 0,right = records.size() - 1;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(records[mid] == mid)left = mid + 1;
            else right = mid;
        }
        //处理细节问题
        return (records[left] == left) ? left + 1 : left;
    }
};

Java

java 复制代码
class Solution {
    public int missingNumber(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == mid)
                left = mid + 1;
            else
                right = mid;
        }
        return left == nums[left] ? left + 1 : left;
    }
}
相关推荐
旺仔仔仔13 分钟前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔21 分钟前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生23 分钟前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川37 分钟前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课1 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析
对空六课1 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
一勺思维1 小时前
我为什么把 Agent 的核心逻辑从 LangChain 里搬出来手写
算法
碧海银沙音频科技研究院1 小时前
基于炬芯ATS308X的LE aduio LC3编解码算法功能实现
算法
小蒋观天下1 小时前
厂区人员徘徊游荡判别——基于时序轨迹速度的逗留行为分级算法落地
大数据·人工智能·深度学习·算法·机器学习·ai大模型
程序员清风1 小时前
堆与优先队列:从 Top K 到任务调度
java·数据结构·算法