要求这个题方法很多很多,比如哈希表,直接遍历、位运算、高斯求和(等数学方法)。
但是这一些时间复杂度都是O(N),而二分查找的时间复杂度则是O(1)。

此时,如果mid在5的左侧区间,那么让left = mid + 1;
如果mid在5以及5的右侧区间,那么让right = mid;
这样二分查找的整体代码就完成了。
但是还会出现一个特殊情况:
如果 数组为 1 2 3 4 ,舍去的数字是5,需要在这里加上一个判断,如果指针的数字等于指针的值,说明出现的就是这种情况。此时改成返回left即可,而不是left + 1。
代码:
            
            
              java
              
              
            
          
          class Solution {
    public int takeAttendance(int[] records) {
        int left = 0;
        int right = records.length - 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;
    }
} https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/description/
https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/description/