二分法,套二分法框架即可

二分法 伪代码。。。

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

        }
        return -1;

这里的思路是

  • 下标也是值, a[index] 一定等于 index
  • 如果中间缺失的话 。 a[index] > index 值了,值就一定会在左边。
  • 不断缩小左边范围,右边范围, 最后左边跟右边下标相等就是缺失的值

按照这个思路写出如下代码

 /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 找缺失数字
     * @param a int整型一维数组 给定的数字串
     * @return int整型
     */
      public int solve(int[] a) {
        int left = 0, right = a.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            // 如果相等 一定是在右边 。因为缺失则会 a[index] > index
            if (a[mid] == mid) {
                left = mid + 1;  //缩小左边范围
            }else if(a[mid] > mid){
                right = mid - 1;  // 缩小右边范围
            }else if(a[mid] < mid){  //这里是套模板
                left = mid + 1;
            }

        }
        return left;
    }