题目:

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

Example 1:

Input: [3,0,1]
Output: 2

Example 2:

Input: [9,6,4,2,3,5,7,0,1]
Output: 8

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

分析:

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

最先想到将数组进行排序,再依次判定数和索引是否对应,首次不对应的索引便是缺失的数。不过由于需要对数组进行排序,这样时间复杂度就不会是线性的了。

也可以创建一个集合,将数组中元素添加进集合中,再从0到n对集合进行查询,不在集合内的便是缺失的数。不过这样空间复杂度就不是常数级的了。

我们知道所给的数的序列是从0到n,且只缺失一个数,根据高斯求和公式,可以快速求得0到n这n+1个数的和,再减去序列中的n个数,剩下的便是缺失的数。

还可以利用异或运算(XOR),我们知道对一个数进行两次完全相同的异或运算会得到原来的数,即

a ^ b ^ b = a

a ^ a = 0

根据题目我们知道,未缺失的数,在[0-n]和数组中各出现了一次,而缺失的数只在[0-n]中出现了一次,根据这个条件和异或的特性可以通过一次循环求得缺失数。

假设所给的序列为0,1,3,4,我们可以求得

missing = 4 ^ 0 ^ 0 ^ 1 ^ 1 ^ 2 ^ 3 ^ 3 ^ 4

     = (4 ^ 4) ^ (0 ^ 0) ^ (1 ^ 1) ^ 2 ^ (3 ^ 3)

     = 0 ^ 0 ^ 0 ^ 0 ^ 2

     = 2

程序:

C++

//use math
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int res = (+n)*n/;
for(int q:nums)
res -= q;
return res;
}
};
//use xor
class Solution {
public:
int missingNumber(vector<int>& nums) {
int res = nums.size();
for(int i = ; i < nums.size(); ++i){
res = res ^ i ^ nums[i];
}
return res;
}
};

Java

class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int res = (1+n)*n/2;
for(int q:nums)
res -= q;
return res;
}
}
class Solution {
public int missingNumber(int[] nums) {
int res = nums.length;
for(int i = 0; i < nums.length; ++i){
res = res ^ i ^ nums[i];
}
return res;
}
}

最新文章

  1. WCF basicHttpBinding之Transport Security Mode, clientCredentialType=&quot;None&quot;
  2. jQuery中多个元素的Hover事件
  3. jquery mobile开发中footer一直在底部的设置方法
  4. 回调函数通俗解析(之前看了很久都不理解,今天终于ok啦)
  5. ext grid 子表格
  6. 特征的转换规则 Transfer Routione
  7. Hibernate个人学习笔记(2)
  8. pg_dump 备份与恢复的简单操作
  9. java多线程:并发包中的信号量和计数栓的编程模型
  10. python中pip的安装
  11. Linux学习之守护进程详解
  12. 阿里云oss总是提示SignatureDoesNotMatch错误怎么办
  13. iOS开发之Copy &amp; MutableCopy及深复制 &amp; 浅复制
  14. sql server2008数据库复制实现数据同步常见问题
  15. 纯css实现图片的灯光照射效果,高逼格图片展示
  16. 读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26
  17. 【转】Steam 开发者收入计算
  18. HI3518EV200+AR0130开发板烧录uboot、kernel、rootfs及其参数配置
  19. C#.Net Core 操作Docker中的redis数据库
  20. P1636 Einstein学画画

热门文章

  1. Day9 - Python基础9 socket基础、粘包
  2. 201871010136-赵艳强《面向对象程序设计(java)》第一周学习总结
  3. flag 履行我的flag
  4. Tensorflow分布式部署和开发
  5. Mybatis框架增删改查
  6. 配置vtk(Win8.1 + VS2012+VTK-5.10.1)
  7. IT兄弟连 Java语法教程 流程控制语句 控制循环结构1
  8. Zookeeper集群的&quot;脑裂&quot;问题处理 - 运维总结
  9. 基于 HTML5 WebGL 构建智能城市 3D 场景
  10. MongoDB for OPS 03:分片 shard 集群