Leetcode刷题详解——点名
1. 题目链接:LCR 173. 点名
2. 题目描述:
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组
records
。假定仅有一位同学缺席,请返回他的学号。示例 1:
输入: records = [0,1,2,3,5] 输出: 4
示例 2:
输入: records = [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7
提示:
1 <= records.length <= 10000
3. 解法1(二分查找):
3.1 解题思路
在第一个缺失位置的左边,数组内的元素都是与数组的下标相等的
在第一个缺失位置的右边,数组内的元素与数组下标是不相等的
3.2 C++算法代码:
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) left=mid+1;
else right=mid;
}
return left==records[left]?left+1:left;
}
};
4. 解法2(直接遍历):
4.1 解题思路:
用完整的数组的和减去缺少一个数的数组的和就可以求出那个缺少的数
4.2 C++算法代码:
class Solution {
public:
int takeAttendance(vector<int>& records) {
int sum=0,sum_arr=0;
for(int i=0;i<=records.size();i++)
{
sum+=i;
if(i<records.size())
sum_arr+=records[i];
}
//用完整数组的和减去缺少数字的数组的和
return sum-sum_arr;
}
};