【LeetCode每日一题】——268.丢失的数字

一【题目类别】

  • 数组

二【题目难度】

  • 简单

三【题目编号】

  • 268.丢失的数字

四【题目描述】

  • 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

五【题目示例】

  • 示例 1:
    输入:nums = [3,0,1]
    输出:2
    解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 2:
    输入:nums = [0,1]
    输出:2
    解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 3:
    输入:nums = [9,6,4,2,3,5,7,0,1]
    输出:8
    解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 4:
    输入:nums = [0]
    输出:1
    解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

六【题目提示】

  • n == nums.length
  • 1 < = n < = 1 0 4 1 <= n <= 10^4 1<=n<=104
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

七【题目进阶】

  • 你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

八【解题思路】

  • 这种题目很容易就想到Hash表的思想,因为题目说了所有数字独一无二,还告诉了最大值不会超过数组长度
  • 所以我们首先新建一个数组map,初始化为0
  • 然后扫描传入的数组,某个数字出现过,就将map对应位置的值置为1,表示出现过
  • 最后再扫描0~n,如果map对应位置为1,说明出现过,不进行操作;如果map对应位置为0,说明未出现过,返回这个值即可
  • 这样就实现了题目进阶所要求的:线性时间复杂度、仅使用额外常数空间的算法

九【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N为数组长度
  • 空间复杂度: O ( N ) O(N) O(N),其中 N N N为数组长度

十【代码实现】

  1. Java语言版
package Array;

public class p268_MissingNumbers {

    public static void main(String[] args) {
        int[] nums = {3, 0, 1};
        int res = missingNumber(nums);
        System.out.println("res = " + res);
    }

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

}
  1. C语言版
#include<stdio.h>
#include<stdlib.h>

int missingNumber(int* nums, int numsSize)
{
	int* map = (int*)calloc(numsSize + 1, sizeof(int));
	for (int i = 0; i < numsSize; i++)
	{
		map[nums[i]] = 1;
	}
	for (int i = 0; i <= numsSize; i++)
	{
		if (map[i] == 0)
		{
			return i;
		}
	}
	return NULL;
}

/*主函数省略*/

十一【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值