【C++习题】24.二分查找算法_0~n-1中缺失的数字

文章目录


题目链接:

剑指 Offer 53 - II. 0~n-1中缺失的数字


题目描述:


解法

哈希表:

建立一个hash表看哪个数字出现次数为0
直接遍历找结果:

看从哪里断开了,断开的数就是我们要找的数
位运算:

异或运算,拿数组里面的数和完整的数放到一起,相同的会抵消掉。

例如:[0,1,2,4,5][0,1,2,3,4,5]

异或后,只剩下3
数学方法:高斯求和公式

先把没缺少的数组求和,利用等差数列公式,然后依次减去原数组的数,得到的结果就是我们缺失的数。
二分算法:

找二段性

虚线左边和下标一样,右边比下标大一。我们要找的就是虚线右边最左侧的那个数的下标。


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 left == records[left] ? left + 1 : left;  
    }
};

图解

例如:records = [0,1,2,3,5]

  1. left = 0, right = 4

    进入循环,mid = 2

    records[mid] == mid,left = 3

  2. left = 3, right = 4

    进入循环,mid = 3

    records[mid] == mid,left = 4

  3. left = 4, right = 4

    跳出循环,返回4

相关推荐
逆向编程1 小时前
QGIS地图投影(CRS坐标参照系)设置
开发语言
free-elcmacom1 小时前
发际线警告!手撕《C陷阱与缺陷》终极 BOSS:signal 函数与 typedef 魔法
c语言·开发语言·visual studio code·visual studio
程序员阿鹏1 小时前
简单介绍一下软引用
java·开发语言·jvm·数据结构·后端
青山是哪个青山1 小时前
LeetCode 123:买卖股票的最佳时机 III
算法
haluhalu.1 小时前
初识 Protobuf:微服务跨语言通信的一份契约
java·c语言·开发语言·c++·python
Zane19941 小时前
写对二分查找有多难?Java集合框架的作者也曾栽在一行mid计算上
算法
Lokey8681 小时前
transformer结构
算法
罗斯8392 小时前
EMBER恶意软件基准数据集
人工智能·算法·安全·网络安全
longxuan012 小时前
倍增算法详解
c++·st表·倍增算法
孙启超2 小时前
【AI开发之Rust】第 12 课:并发模型与同步原语
开发语言·后端·rust