【剑指offer】面试题68(补充) 0到n-1中缺失的数字(二分法的进一步应用)

题目

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。

在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

输出

输入:[0,1,2,4]

输出:3

解法1: 暴力枚举法

 直接进行一遍遍历就可以,如果发现不符合条件(就是下标不等于数值),一定是第一个不符合的。

AC代码如下:

class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        int i = 0;
        for( ; i< nums.size(); i++)
            if(nums[i] != i) break;
        return i;
    }
};

解法2:进行二分 返回所求的值

由于题目给定的是单调递增的序列, 缺少一个数字, 所以来说,左边的序列(缺失数字前面)的数值是等于下标的,右边序列的数值是不等于下标的,我们可以用这两个性质进行二分,找出这个临界点。 最后如果缺失的是最后一个数字,判断一下,此时二分就是返回的最后一个数字的下边, 我们只需要将最后一个下标进行++即可。


AC代码如下:

class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        if(!nums.size()) return 0;
        int l = 0, r = nums.size() - 1;   // 这里减1 不减1,都行
        while(l < r)
        {
            int mid = l + r >> 1;
            if(nums[mid] != mid) r = mid;
            else
                l = mid + 1;
        }
        // 如果整个序列是连续的,只缺少最后一个数
        if(nums[r] == r) r ++ ;
        
        return r;
    }
};
个人如果再刷解答剑指上的题目,可以加我V,共同进步吧~~~

 

加微信最好备注下(csdn+ 剑指offer)

 

 

 

posted @ 2020-11-06 21:53  鹏鹏玩编程  阅读(59)  评论(0编辑  收藏  举报