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;
        }
    };
    

    在这里插入图片描述

  • 相关阅读:
    插入排序(二)
    选择排序(一)
    (转)示例化讲解RIP路由更新机制
    Css元素居中设置
    (转)盒子概念和DiV布局
    (转)浅析CSS——元素重叠及position定位的z-index顺序
    (转)Java中的static关键字解析
    (转)字符串循环移位
    linux把某个文件拷贝到不同的目录下面
    linux中查找文件并合并文件
  • 原文地址:https://www.cnblogs.com/ttzz/p/14409903.html
Copyright © 2011-2022 走看看