算法:LCR 173. 点名 (原:剑指 offer:0~n-1 中缺失的数字 )

题目

链接:leetcode链接

思路分析(一题多解)

思路一:高斯求和公式

利用高斯求和公式求出0~n的和,然后减去nums数组中的每一个数,最后的结果就是缺失的数字

时间复杂度,O(N)

过于简单,就不写代码了


思路二:差分

求出每一个元素与前一个元素的差,然后哦遍历这个差,当发现差值不等于1的时候,就返回该位置的值即可。

细节:要特殊处理一下缺失0的情况。

时间复杂度,O(N)

C++ 复制代码
 int takeAttendance(vector<int>& records) {
        int n = records.size();
        if(records[0] != 0)return 0;

        vector<int> dp(n);
        int  i = 0;
        for( i = 1;i < n;i++)
        {
            dp[i] = records[i] - records[i - 1];
            if(dp[i] != 1)
            break;
        }
        
        return i;
    }

思路三:位运算

采用按位异或的操作,相同为0,不同为1

将0~n的所有数字均与nums中的数字按位异或一下,最后的结果就是缺失的数字

时间复杂度O(N)

C++ 复制代码
int takeAttendance(vector<int>& records) {
        int tmp = 0;
        int n = records.size();
       for(int i = 1;i <= n;++i)
       {
        tmp^=i;
       }

        for(int i = 0;i < records.size();++i)
        {
            tmp^=records[i];
        }

        return tmp;
    }

思路四:二分算法

注意了,这是因为题目特殊,题目是有序的情况下,才能存在这种二段性,否则要先排序

如何寻找这个二段性?

我们可以发现,当有序的序列缺失了一个元素之后

在缺失元素之前的每一个元素都和下标相等,

而缺失元素之后的每一个元素都比下标大。

根据这个二段性,我们就可以使用二分算法了。

还是寻找左边界的二分。

细节:

while(left < right) // 不能取等,否则会死循环

mid = left + (right - left) / 2;

left = mid + 1;

right = mid;

如果缺失的元素是最后一个数据的话,需要特判

时间复杂度O(logN)

C++ 复制代码
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;
        }

        if(left == records[left]) return left + 1;
        
        return left;
    }
相关推荐
B612 little star king10 分钟前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦11 分钟前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展
时光追逐者16 分钟前
C# 哈希查找算法实操
算法·c#·哈希算法
Jasmine_llq40 分钟前
《P3825 [NOI2017] 游戏》
算法·游戏·枚举法·2-sat 算法·tarjan 算法·邻接表存储
Miraitowa_cheems44 分钟前
LeetCode算法日记 - Day 38: 二叉树的锯齿形层序遍历、二叉树最大宽度
java·linux·运维·算法·leetcode·链表·职场和发展
wangzy198244 分钟前
图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定
算法
艾醒1 小时前
探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
人工智能·深度学习·算法
艾醒1 小时前
探索大语言模型(LLM):Open-WebUI的安装
人工智能·算法·全栈
猫天意2 小时前
【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络
人工智能·深度学习·神经网络·算法·机器学习·卷积神经网络
宁檬精2 小时前
算法练习——55.跳跃游戏
数据结构·算法·游戏