zoukankan      html  css  js  c++  java
  • 【Java】 剑指offer(53-2) 0到n-1中缺失的数字

     

    本文参考自《剑指offer》一书,代码采用Java语言。

    更多:《剑指Offer》Java实现合集  

    题目

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

    思路

      分析易知,数组形式如下:

      如果从头到尾依次比较值与小标是否相等,时间复杂度为O(n),效率低。

      由于是排序数组,我们继续考虑使用二分查找算法,结合上图可知:

        当中间数字等于其下标时,我们在后半部分查找;

        当中间数字不等于其下标时,

        1)如果中间数字的前一个数字也不等于其下标,则在前半部分查找;

        2)如果中间数字的前一个数字等于其下标,则说明中间数字的下标即为我们所要找的数字。

    测试算例 

      1.功能测试(缺失数字位于数组开头、中间或者结尾)

      2.边界值测试(数字只有0或1)

      2.特殊测试(null)

    Java代码

    //题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
    //都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
    //中,请找出这个数字。
    
    public class MissingNumber {
        public int getMissingNumber(int[] arr) {
            if(arr==null || arr.length<=0)
                return -1;
            int low=0;
            int high=arr.length-1;
            while(low<=high) {
                int mid=(low+high)>>1;
                if(arr[mid]!=mid) {
                    if(mid==0 || arr[mid-1]==mid-1)
                        return mid;
                    high=mid-1;
                }else {
                    low=mid+1;
                }
            }
            if(low==arr.length)
                return low;
            return -1;
        }
    }
    

      

    收获

      1.同53-3

      

    更多:《剑指Offer》Java实现合集  

  • 相关阅读:
    「2017 山东三轮集训 Day1」Flair
    Luogu P4321 随机漫游
    「WC2018」通道
    「CTSC2018」暴力写挂
    关于二项式相乘
    BZOJ #3625 CF #438E 小朋友和二叉树
    GIS可视化
    微信小程序Promise对象
    SQL Server-执行计划教会我如何创建索引
    IIS+NGINX 负载web服务器
  • 原文地址:https://www.cnblogs.com/yongh/p/9958093.html
Copyright © 2011-2022 走看看