LeetCode-268 缺失的数字

1. 题目描述

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

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

输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

2. 解题思路

解法一:位运算

分析

由于异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。

算法

我们知道数组中有 n个数,并且缺失的数在 ][0..n] 中。因此我们可以先得到 [0..n]的异或值,再将结果对数组中的每一个数进行一次异或运算。未缺失的数在 [0..n] 和数组中各出现一次,因此异或后得到 0。而缺失的数字只在[0..n] 中出现了一次,在数组中没有出现,因此最终的异或结果即为这个缺失的数字。

在编写代码时,由于 [0..n] 恰好是这个数组的下标加上 n,因此可以用一次循环完成所有的异或运算,例如下面这个例子:

下标 0 1 2 3
数字 0 1 3 4

可以将结果的初始值设为 n,再对数组中的每一个数以及它的下标进行一个异或运算,即:

missing = 4∧(0∧0)∧(1∧1)∧(2∧3)∧(3∧4)
=(4∧4)∧(0∧0)∧(1∧1)∧(3∧3)∧2
=0∧0∧0∧0∧2
=2

就得到了缺失的数字为 2。

class Solution {
    public int missingNumber(int[] nums) {
        int missing = nums.length;
        for (int i = 0; i < nums.length; i++) {
            missing ^= i ^ nums[i];
        }
        return missing;
    }
}

2.2 解法二:数学方法

利用高斯求和公式求解出[0..n] 的和,减去数组中所有数的和,就得到了缺失的数字。

class Solution {
    public int missingNumber(int[] nums) {
        int expectedSum = nums.length*(nums.length + 1)/2;
        int actualSum = 0;
        for (int num : nums) actualSum += num;
        return expectedSum - actualSum;
    }
}

3.参考链接

https://leetcode-cn.com/problems/missing-number/solution/que-shi-shu-zi-by-leetcode/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,966评论 0 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,018评论 6 13
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 10,564评论 0 18
  • [LeetCode][Python]268. 缺失数字给定一个包含 0, 1, 2, ..., n 中 n 个数的...
    bluescorpio阅读 1,801评论 0 1
  • 一、测试环境: 手机:iPhone XS 版本:iOS 12.1.2 软件:AppSo 软件版本:V 3.0.7 ...
    亦安安阅读 1,891评论 0 0

友情链接更多精彩内容