目录
题目地址
今天刷点名(缺失的数字),大家有兴趣可以点上看看题目要求,试着做一下。
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)