【剑斩OFFER】算法的暴力美学——点名
一、题目描述

二、算法原理

当我们看到这道题目时,我们一般是直接从题目给出的数组来找这些数字的规律,题目给出的数字的除了这些数字是逐渐递增的,就没了。所以我们不防从把数组的下标写出来,此时我们可以看到数组的数字和下标相等时,代码没有数字缺少,反之就是缺少一个数字;从数组的下标结合题目给出的数组来看,只要找缺少数字的那小部分的数组的最左边就是缺少的那个数字,当然缺少的不是上面绿色部分的8而是他的下标7。
思路:二分查找的最左端的二分查找的模板
当数组的中间点处于蓝色部分的数字时,让left往mid的后面找,不包含 mid :
if:nums[ mid ] - mid == 0 ,left = mid + 1
else :right = mid
循环条件:left < right
求中点的方式:int mid = left + ( right - left )/2
特殊情况:

解决方法:left == records[ left ] ,表明里面没有数组里面没有缺少的数字,但是题目要求我们至少要一个数字缺少,所以:return recordes[ left ] + 1
三、代码实现
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) right = mid;else left = mid + 1;}if(left == records[left]) return records[left] + 1;//处理特殊情况return left;}
};

