zoukankan      html  css  js  c++  java
  • 剑指Offer_#53

    剑指Offer_#53 - II_0~n-1中缺失的数字

    Contents

    题目

    一个长度为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

    思路分析

    二分查找。

    • 如果缺失的数字不是数组的第一个或者最后一个,那么比较好处理,可以直接在数组中定位到这个位置,然后将此位置的下标返回;
    • 如果缺失的是第一个数字0,那么应该返回0;
    • 如果缺失的是最后一个数字,应该返回n-1(这时已经超出下标范围,最后一个下标是n-2)。所以如果我们用mid作为返回值,对这种情况就无能为力,因为mid不会超出数组下标范围。
      • 这里的处理方法和上题剑指Offer_53 - I_在排序数组中查找数字 有些类似,为了寻找右边界,不使用mid作为定位的结果,而是使用左指针start作为定位结果。这样一来,如果缺失的数字是最后一个,也能得到正确结果,而不需要做任何特殊的处理。

    解答

    class Solution {
        public int missingNumber(int[] nums) {
            int start = 0;
            int end = nums.length - 1;
            while(start <= end){
                int mid = start + (end - start) / 2;
                if(nums[mid] == mid) start = mid + 1;
                if(nums[mid] != mid) end = mid - 1;
            }
            //这样写的好处是考虑到了省略数字在头尾的情况
            return start;
        }
    }
  • 相关阅读:
    数据的安装及常识
    数据库基础
    zabbix入门
    zabbix安装报错
    https
    rewrite
    keepalived
    计算机键盘在编辑情况下键盘不见,仅能输入字母
    集成学习
    js
  • 原文地址:https://www.cnblogs.com/Howfars/p/13355362.html
Copyright © 2011-2022 走看看