[剑指 Offer 53 - II. 0~n-1中缺失的数字]

剑指 Offer 53 - II. 0~n-1中缺失的数字

题解:

一个长度为n-1的递增排序数组中的所有数字都是唯一的,即一个长度为n-1数组中的元素都在[0,n-1]这个范围内,且顺序递增,所以数组中肯定会缺失 一个属于[0,n-1]的数,我们就是要找出这个数。

解法:

方法一:

双重for循环,因为这个数组是从0开始的,所以我们可以直接用i来和数组中的数进行比较。

而代码中的j、n是起验证作用,当我们每用i比较一次数组中所有的元素,如果有相同的数,n就会加一,如果没有n就不会变,此时我们再用n和j比较,如果n=j,就是此时的 i 在数组中没有出现,所以返回 i。如果 n!=j,则 j++ 来确保下一轮循环的准确性。循环外的return 0;是为了保证代码的正确性,无关程序正误。

class Solution {
    public int missingNumber(int[] nums) {
        int size = nums.length;
        for (int i = 0;i <=size;i++){
            int j = 0;
            int n = j;
            for (int num : nums){
                if (i == num){
                    n++;
                }
            }
            if (n == j){
                return i;
            }else {
                j++;
            }
        }
        return 0;
    }
}

方法二:(官方)

核心思想就是因为数组递增,所以如果中间没有缺失,则下表和数组元素一一对应,如果确实下标一定小于数组元素。所以应用二分法的原理可以进行查找。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值