zoukankan      html  css  js  c++  java
  • 剑指 Offer 53

    一、题目描述

    一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
    示例 1:
    输入: [0,1,3]
    输出: 2
    示例 2:
    输入: [0,1,2,3,4,5,6,7,9]
    输出: 8
    限制:
    1 <= 数组长度 <= 10000

    二/题解
    有序数组,使用二分法
    时间复杂度:O(log n)
    在这里插入图片描述

    class Solution {
        public int missingNumber(int[] nums) {
            if(nums[0]!=0) return 0;
            int n = nums.length;
            int left = 0,right = n-1;
            
            while(left <= right){
                int mid = left + ((right - left)>>1);
                if(nums[mid]!=mid&&nums[mid-1]==mid-1)
                    return mid;
                else if(nums[mid]==mid)
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            return n;
        }
    }
    

    优化:

    class Solution {
        public int missingNumber(int[] nums) {
            
            int left = 0,right = nums.length-1;
            
            while(left <= right){
                int mid = left + ((right - left)>>1);
                if(nums[mid]==mid)
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            return left;
        }
    }
    

    在这里插入图片描述

    方法二:异或
    如果数组无序,可使用异或
    数组的长度为n-1,且数字范围都在0到n-1内,我们将数组中的n-1个数字与0到n-1共n个数依次进行异或,异或相同的数字得000,最后剩下来的就只有缺失的数字
    时间复杂度:o(n)

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int res = nums.size();
            for(int i = 0;i < nums.size();i++){
                res ^= nums[i] ^ i;
            }
            return res;
        }
    };
    

    在这里插入图片描述

  • 相关阅读:
    $NOIP2012$ 题解报告
    $NOIP2011$ 题解报告
    $NOIP2007$ 题解报告
    $NOIP2006$ 题解报告
    $NOIP2005$ 题解报告
    $NOIP2003$ 题解报告
    $NOIP2002$ 题解报告
    $NOIP2001$ 题解报告
    $NOIP2000$ 题解报告
    $NOIP1999$ 题解报告
  • 原文地址:https://www.cnblogs.com/ttzz/p/14409903.html
Copyright © 2011-2022 走看看