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 <= 10
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二.

**
**

class Solution &#123;
    public int missingNumber(int[] nums) &#123;
         Arrays.sort(nums);

        // 判断 n 是否出现在末位
        if (nums[nums.length-1] != nums.length) &#123;
            return nums.length;
        &#125;
        // 判断 0 是否出现在首位
        else if (nums[0] != 0) &#123;
            return 0;
        &#125;

        // 此时缺失的数字一定在 (0, n) 中
        for (int i = 1; i < nums.length; i++) &#123;
            int expectedNum = nums[i-1] + 1;
            if (nums[i] != expectedNum) &#123;
                return expectedNum;
            &#125;
        &#125;

        // 未缺失任何数字(保证函数有返回值)
        return -1;
    &#125;

//作者:LeetCode
//链接:https://leetcode-cn.com/problems/missing-number/solution/que-shi-shu-zi-by-leetcode/

&#125;

**

解析:我们对数组进行排序,随后我们可以在常数时间内判断两种特殊情况:0 没有出现在数组的首位,以及
n 没有出现在数组的末位。如果这两种特殊情况都不满足,那么缺失的数字一定在 0 和 n 之间(不包括两者)。此时我们可以在线性时间内扫描这个数组,如果某一个数比它前面的那个数大了超过 1,那么这两个数之间的那个数即为缺失的数字。


文章作者:   future
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 future !
 上一篇
557. 反转字符串中的单词 III 557. 反转字符串中的单词 III
557. 反转字符串中的单词 III难度简单 274给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:输入:“Let’s take LeetCode contest”输出:“s’teL ekat e
2021-02-27 future
下一篇 
543. 二叉树的直径 543. 二叉树的直径
543. 二叉树的直径给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 :给定二叉树          1         /         2  
2021-02-27 future
  目录