要求这个题方法很多很多,比如哈希表,直接遍历、位运算、高斯求和(等数学方法)。
但是这一些时间复杂度都是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;
}
}