class Solution {
public int takeAttendance(int[] records) {
int n = records.length;
int left = 0;
int right = n - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(records[mid] == mid) left = mid + 1;
else right = mid - 1;
}
return left;
}
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length - 1;
while (l <= r) {
int m = (r - l + 1) / 2 + l;
if (records[m] == m) {
l = m + 1;
} else {
r = m - 1;
}
}
return l;
}
}
class Solution {
public int missingNumber(int[] nums) {
int l = 0, r = nums.length – 1;
while(l < r){
int mid = (r – l) / 2 + l;
if(nums[mid] mid) l = mid + 1;
else r = mid;
}
public int takeAttendance(int[] records) {
int l=0,r=records.length-1;
while(l<r){
int mid= (r-l)/2+l;
if(records[mid]mid){
l=mid+1;
}
else{
r=mid-1;
}
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(vector<int>& records) {
int left = 0;
int right = records.size()-1;
while(left<=right){
int mid = left+(right-left)/2;
if(records[mid] == mid){// 判断元素与索引的值是否一致
left = mid + 1;// 一致(因为是升序排列的,该元素一致前面的元素也一致),说明缺失的数字在当前索引的右边
}else{
right = mid - 1;// 不一致,说明缺失的数字可能是当前索引对应的值或者在它的左边
}
}
// 当左边界与右边界相等时,可能已经指向该缺失的数字,但是还有一种可能是缺失的数字在数组之外
// 即[0,1,2],缺少3,长度为3,即n=4,数的范围0~3
// return nums[right] != right ? right : right + 1;
return left;//一定是返回left,跳出时,变量 left 和 right 分别指向 “右子数组的首位元素” 和 “左子数组的末位元素
}
};
class Solution {
public int takeAttendance(int[] records) {
int l=0;
int r=records.length-1;
while(l<r){
int mid=(r-l)/2+l;
if(records[mid]==mid){
l=mid+1;
}else{
r=mid;
}
}
// return records[l];
return records[l] == l ? l + 1 : l;
}
}
class Solution {
public:
int takeAttendance(vector& records) {
int i = 0, j = records.size() – 1;
while(i < j) {
int m = i + (j – i) / 2;
if(records[m] m) i = m + 1;
else j = m – 1;
}
return records[i] i ? i + 1 : i;
}
};
打卡
java
class Solution{
public int countTarget(int[] scores, int target){
return helper(scores, target) – helper(scores, target – 1);
}
int helper(int[] scores, int tar){
int i = 0, j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] <= tar) i = m + 1;
else j = m – 1;
}
return i;
}
}
提交
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length - 1;
//并非传统意义的二分法,算是双指针找不对劲
while(l < r){
int mid = (l+r)/2;
if(records[mid] == mid) l = mid + 1;
else r = mid;
}
return records[l] == l?records.length:l;
}
}
class Solution {
public int takeAttendance(int[] records) {
int l = 0, r = records.length - 1;
while(l < r){
int mid = (r - l) / 2 + l;
if(records[mid] == mid) l = mid + 1; //如果下标和值是一样的,说明在右边
else r = mid;//否则在左边
}
//return l 不能直接返回,如果一整个数组都是完整 的数组,说明缺席的数字是最后一个数
return records[l] == l ? l + 1 : l;
}
}
class Solution {
public int takeAttendance(int[] records) {
int begin = 0;
int end = records.length – 1;
while(begin <= end){
int mid = (begin + end) / 2;
if(records[mid] != mid) end = mid – 1;
else begin = mid + 1;
}
return begin;
}
}
//时间复杂度Ologn
//空间复杂度O1
共以下 23 个回答
class Solution {
public int takeAttendance(int[] records) {
int n = records.length;
}
时间复杂度:O(logn)
空间复杂度:O(1)
二分查找,匹配中间的数据是否与下标相等
class Solution {
public int missingNumber(int[] nums) {
int l = 0, r = nums.length – 1;
while(l < r){
int mid = (r – l) / 2 + l;
if(nums[mid] mid) l = mid + 1;
else r = mid;
}
}提交
public int takeAttendance(int[] records) {
int l=0,r=records.length-1;
while(l<r){
int mid= (r-l)/2+l;
if(records[mid]mid){
l=mid+1;
}
else{
r=mid-1;
}
思路:找到下标和值不同的那个数据
时间复杂度O(logN)
class Solution {& records) {
public:
int takeAttendance(vector
int lhs = 0;
int rhs = records.size()-1;//定义右数组
while(lhs <= rhs){
int mid = (rhs +lhs) / 2;
if(mid records[mid]){
lhs = mid +1;
}else {
rhs = mid-1;
}
}
return lhs;
};
空间复杂度log(n),空间复杂度O(1)
时间复杂度:log(n)
额外空间复杂度:O(1)
class Solution {& records) {
public:
int takeAttendance(vector
int i = 0, j = records.size() – 1;
while(i < j) {
int m = i + (j – i) / 2;
if(records[m] m) i = m + 1;
else j = m – 1;
}
return records[i] i ? i + 1 : i;
}
};
打卡
java
class Solution{
public int countTarget(int[] scores, int target){
return helper(scores, target) – helper(scores, target – 1);
}
int helper(int[] scores, int tar){
int i = 0, j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] <= tar) i = m + 1;
else j = m – 1;
}
return i;
}
}
提交
时间复杂度O(log(n)),空间复杂度O(1),注意边界条件,题目假定一定有人没来,即如果0~n-1都齐了,没到的一定是第n个
时间复杂度O(log(n))
空间复杂度O(1)
“`C++& records) {
class Solution {
public:
int takeAttendance(vector
int left = 0;
int right = records.size() – 1;
//特殊情况
if(records.empty() == true)
{
return 0;
}
if(records[0] != 0)
{
return 0;
}
if(records[right] != right + 1)
{
return right + 1;
}
};
“`
打卡
思路:寻找第一个records[idx] > idx的位置,返回idx即可。
“`c++& records) {
class Solution {
public:
// 寻找第一个 val > 对应下标
int takeAttendance(vector
int len = records.size();
int start = 0, end = len – 1, mid;
while (start <= end) { mid = (start + end) / 2; if (records[mid] == mid) start = mid + 1; else end = mid - 1; } return start; } }; ```
class Solution {& records) {
public:
int takeAttendance(vector
int l = 0, r = records.size() – 1;
while(l <= r){
int mid = (l + r) / 2;
if(records[mid] mid) l = mid + 1;
else r = mid – 1;
}
return l;
}
};
时间复杂度O(logn),空间复杂度O(1)
class Solution {
public int takeAttendance(int[] records) {
int begin = 0;
int end = records.length – 1;
while(begin <= end){
int mid = (begin + end) / 2;
if(records[mid] != mid) end = mid – 1;
else begin = mid + 1;
}
return begin;
}
}
//时间复杂度Ologn
//空间复杂度O1
打卡
https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/solutions/2688232/lcr-173-dian-ming-by-yukislab-ltfl