0~n-1中缺失的数字(剑指offer 53-II)

这篇博客探讨了一道编程题,题目要求在递增排序数组中找到唯一缺失的数字。作者提供了两种解决方案:一是通过遍历数组,比较索引与值,找到第一个不匹配的位置返回;二是利用二分查找,不断缩小查找范围,直到找到缺失的数字。博客分析了两种方法的时间复杂度,分别是O(n)和O(logn),并给出了Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、题目描述 

二、思路讲解 

        1、方法一

        2、方法二

三、算法描述

        1、方法一

四、Java代码实现 

        1、方法一

        2、方法二

五、时空复杂度分析

        1、方法一

        2、方法二


一、题目描述 

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

二、思路讲解 

        1、方法一

        对于我这个算法小白来说,每次看见查找的题总要试试能不能暴力破解,这次成功了。

        因为数组是递增的,索引和值对应不上,则必然缺失了;若全对上了,则必然缺失了n。

        2、方法二

        一说到查找,首选应该是二分查找。

        承接上面的思路,如果二分位置的索引等于值,那么左边都不用查了,直接将右边作为子数组,继续二分即可;如果二分位置的索引不等于值,则将右边的指针左移一位,继续二分。直至两指针相遇,返回i指针对应的值即可。

三、算法描述

        1、方法一

        遍历数组nums,若索引与值不同,则返回索引;若能够走出循环,则必然数组里面必然是0~n-1的情况,则直接返回n        

四、Java代码实现 

        1、方法一

class Solution {
	
	
	public static int missingNumber(int[] nums) {

		//遍历数组
		for(int i=0; i<nums.length; i++) {
			//因为数组为递增数组,所以若索引小于它对应的值,则说明缺失了这个索引本该对应的数字
			if(i < nums[i]) {
				return i;
			}
		}
		//考虑[0]、[0,1]、[0,1,2]……的情况
		return nums.length;
    }
}

        2、方法二

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;
    }
}

 

五、时空复杂度分析

        1、方法一

        时间复杂度:O(n)        遍历数组一次

        空间复杂度:O(1)

        2、方法二

        时间复杂度:O(logn)        二分查找

        空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值