算法: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;
    }
相关推荐
MediaTea6 小时前
AI 术语通俗词典:C4.5 算法
人工智能·算法
Navigator_Z6 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
WBluuue6 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
风筝在晴天搁浅6 小时前
n个六面的骰子,扔一次之后和为k的概率是多少?
算法
MATLAB代码顾问8 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
代码飞天8 小时前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
jiushiapwojdap8 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
笨笨饿8 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
纽扣6679 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
消失的旧时光-19439 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法