【leetcode刷题笔记】:剑指 Offer 53 - II. 0~n-1中缺失的数字

1.leetcode刷题记录:数组简单题

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
【leetcode刷题笔记】:剑指 Offer 53 - II. 0~n-1中缺失的数字_第1张图片

第一种方法:遍历解决

思路:数组有序,从头开始遍历,遇到元素值与下标不相等的就是缺少的数。

int missingNumber(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            if(nums[i] != i)
                return i;
        }
        return nums.size();
    }

第二种方法:异或法

思路:因为1^ 1=0 、0 ^ n=n 这样同时异或元素和下标就可以找出缺失的数了
ps:感觉疑惑操作很酷啊,如果数组是无序,异或可能就是最快的解法,但是本题有序,就要考虑用到这个方法了。

int missingNumber(vector<int>& nums) {
        int res=nums.size();
        for(int i=0;i<nums.size();i++){
            res^=nums[i];
            res^=(i+1);  //针对下标,数组从0开始,
        }
        return res;
    }

第三种:二分法

思路:

  • 二分法特别的注重细节,很容易出现死循环,注意边界条件
  • 对于有序的数组, 都应该想到用二分法搜索
int missingNumber(vector<int>& nums) {
        int l=0,h=nums.size()-1,m;
        if(nums[0] != 0)
            return 0;

        while(l<=h){
            m = (l+h)/2;
            if(nums[m] == m)//右边
                l = m + 1;
            else
                h = m-1;
        }
        return l;
    }

你可能感兴趣的:(leetcode刷题笔记)