和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ53-II. 0~n-1中缺失的数字

原题链接


描述

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



示例

输入: [0,1,3]
输出: 2

思路

递增排序数组,用到二分法。

正常情况下应该是:下标是多少,数组中该位置的值就应该是多少。

如果中位数的值等于索引值,说明该数及以前的数都在正确的位置上,要找到那个数在中位数的右边;

如果不等于索引值,说明要找的那个数在中位数的左边。


解答

package com.klaus.array.prob53.p2;

import org.junit.Test;

public class Solution {

    public int missingNumber(int[] nums) {
        int i = 0, j = nums.length - 1;
        while (i <= j) {
            int mid = (i + j) / 2;
            if (nums[mid] == mid) i = mid + 1;
            else j = mid - 1;
        }
        return i;
    }

    // public int missingNumber(int[] nums) {
    //     // if (nums[0] == 1) return 0;
    //     for (int i = 0; i < nums.length; i++) {
    //         if (nums[i] != i) return i;
    //     }
    //     return nums.length;
    // }

    @Test
    public void test() {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        System.out.println(missingNumber(arr));
    }

}
posted @ 2021-09-10 23:26  klaus08  阅读(29)  评论(0编辑  收藏  举报