算法: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;
    }
相关推荐
无极小卒几秒前
如何在三维空间中生成任意方向的矩形内部点位坐标
开发语言·算法·c#
FMRbpm4 分钟前
链表中出现的问题
数据结构·c++·算法·链表·新手入门
Kuo-Teng22 分钟前
LeetCode 206: Reverse Linked List
java·算法·leetcode·职场和发展
庸子1 小时前
Kubernetes调度器深度解析:从资源分配到亲和性策略的架构师之路
java·算法·云原生·贪心算法·kubernetes·devops
Sunhen_Qiletian2 小时前
YOLOv2算法详解(上篇):从经典到进化的目标检测之路
算法·yolo·目标检测
QTreeY1232 小时前
detr目标检测+deepsort/strongsort/bytetrack/botsort算法的多目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
AiXed2 小时前
PC微信协议之nid算法
python·网络协议·算法·微信
谈笑也风生3 小时前
经典算法题之子集(四)
算法
mit6.8243 小时前
划分dp+滑窗+前缀和|deque优化
算法
Zach_yuan3 小时前
算法1111
算法