class Solution {
public int takeAttendance(int[] records) {
int i=0, j = records.length-1;
while (i <= j) {
int m = (i+j) / 2;
if (records[m] == m) i = m + 1;
else j = m - 1;
}
return i;
}
}
class Solution {
public int takeAttendance(int[] records) {
// 使用 二分
// 若缺席 位于 前半部分 则 mid < len+1 反之
int len = records.length;
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (records[mid] != mid) {
// 前半段缺失
right = mid - 1;
} else {
// 后半段缺失
left = mid + 1;
}
}
return left;
}
}
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length - 1, m = 0;
while(l <= r){
m = l + (r - l) / 2;
if(records[m] == m){
// 说明左边没问题
l = m + 1;
}else{
// 说明左边有问题
r = m - 1;
}
}
return l;
}
}
class Solution {
public int takeAttendance(int[] records) {
int l = 0;
int r = records.length - 1;
int result = records.length;
while (l <= r) {
int mid = l + (r - l) / 2;
if (records[mid] != mid) {
result = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return result;
}
}
思路:同样采用划分蓝红数组颜色边界的思想,蓝色为所有records[mid]==mid,即正常排序的同学,红色为非正常排序的同学,所以第一个红色就是缺课的同学,返回红色的第一个值即right。边界情况有两种,一种是全为蓝色,也就是班里最后一位同学缺课,此时right即为records.length,另一种全为红色,也就是第一个同学缺课,此时需要特殊处理即第一个元素不为0时直接返回0
class Solution {
public int takeAttendance(int[] records) {
int len=records.length;
if(records[0]==1) return 0;
int left=-1;
int right=records.length;
int mid=0;
while(left+1!=right){
mid=((right-left)/2)+left;
if(records[mid]==mid) left=mid;
else right=mid;
}
return right;
}
}
时间复杂度:O(logn)
空间复杂度:O(1)
class Solution {
public int takeAttendance(int[] records) {
int len=records.length;
if(records[0]==1) return 0;
int left=-1;
int right=records.length;
int mid=0;
while(left+1!=right){
mid=((right-left)/2)+left;
if(records[mid]==mid) left=mid;
else right=mid;
}
return right;
}
}
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length-1;
while(l < r){
int m = (l + r)/2;
if(records[m] m){
l = m+1;
}else if(records[m] > m){
r = m;
}
}
return r records.length – 1 && records[r] r ? r + 1 : r;
}
}
思路:二分比对数组元素和下标
时间:O(lgn)
空间:O(1)
//二分查找数组中不等于坐标值的位置
public int takeAttendance(int[] records) {
int left = 0;
int right = records.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (records[mid] == mid) {
left = mid + 1;
}else {
right = mid - 1;
}
}
return left;
}
共以下 15 个回答
打卡
时间复杂度O(logn), 空间复杂度O(1)
解题思路
– 因为数据都是从0开始,1递增的。通过比较值和下标是否相等就能鉴别异常数据在哪一侧了
【题解1】
思路: 使用二分查找 若record[mid] < mid 说明 缺失发生在前半部 反之
思路:二分查找比较值与下标,不相等则说明缺失的数字在此区间内,找到第一个出现不相等的区间边界即可
时间o(logn)
空间o1
二分,l和r 若arr[mid]mid说明缺的在右边,l=mid+1,反之r=mid-1
ologn o1
二分查找第一个下标与值不相等的点即可。
时间复杂度O(logN),空间复杂度O(1)。
如果不相等,则向左寻找,如果相等,则向右寻找
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length-1;
while(l < r){
int m = (l + r)/2;
if(records[m] m){
l = m+1;
}else if(records[m] > m){
r = m;
}
}
return r records.length – 1 && records[r] r ? r + 1 : r;
}
}
思路:二分比对数组元素和下标
时间:O(lgn)
空间:O(1)
//二分查找数组中不等于坐标值的位置
public int takeAttendance(int[] records) {
思路:顺序遍历、二分法、异或运算
时间复杂度:O(n)、O(logn)、O(n)
空间复杂度:都是 O(1)