目录
题目地址
今天刷点名(缺失的数字),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
审题目+事例+提示:
record为升序数组
方法:
遇到排序数组的搜索问题,首先想到二分法
解题思路(二分法):
依据题意,我们可以把数组分为两部分,
左子数组,record[i]=i
右子数组,record[i]!=i
所以,缺失的数字其实就是右子数组的首元素。
- 初始化i=0即左边界,j=length-1,即右边界
- 循环二分:当i<=j时跳出循环
·计算中点m=(i+j)/2(向下取整)
·record[m]==m,即缺失数字在[m+1,j],则i=m+1
·record[m]!=m,即缺失数字在[i,m-1],则j=m-1
3、最后跳出循环,i指向位置为缺失的数字
代码:
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;
}
}
注:时间复杂度为(logn)
方法二:直接遍历
class Solution {
public int missingNumber(int[] nums) {
if (nums[0]==1) return 0;
for (int i = 0;i<nums.length;i++){
if (nums[i]!=i) return i;
}
return nums.length;
}
}
注:时间复杂度为(n)