转载:http://www.cnblogs.com/grandyang/p/4756677.html

描述

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

For example,
Given nums = [0, 1, 3] return 2.

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 中没有出现在序列中的那个数。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

解析、代码

求和法

这道题给我们n个数字,是0到n之间的数但是有一个数字去掉了,让我们寻找这个数字,要求线性的时间复杂度和常数级的空间复杂度。那么最直观的一个方法是用等差数列的求和公式求出0到n之间所有的数字之和,然后再遍历数组算出给定数字的累积和,然后做减法,差值就是丢失的那个数字,参见代码如下:

解法一:

class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum = 0, n = nums.size();
for (auto &a : nums) {
sum += a;
}
return 0.5 * n * (n + 1) - sum;
}
};

异或法

这题还有一种解法,使用位操作Bit Manipulation来解的,用到了异或操作的特性,相似的题目有Single Number 单独的数字, Single Number II 单独的数字之二Single Number III 单独的数字之三。那么思路是既然0到n之间少了一个数,我们将这个少了一个数的数组合0到n之间完整的数组异或一下,那么相同的数字都变为0了,剩下的就是少了的那个数字了,参加代码如下:

nums[index] = index

解法二:

class Solution {
public:
int missingNumber(vector<int>& nums) {
int res = 0;
for (int i = 0; i < nums.size(); ++i) {
res ^= (i + 1) ^ nums[i];
}
return res;
}
};
public int missingNumber(int[] nums) {
int res = nums.length;
for (int i = 0; i < nums.length; ++i) {
res ^= (i) ^ nums[i];
}
return res;
}

二分法

这道题还可以用二分查找法来做,我们首先要对数组排序,然后我们用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将right赋为mid,反之则将left赋为mid+1。那么看到这里,作为读者的你可能会提出,排序的时间复杂度都不止O(n),何必要多此一举用二分查找,还不如用上面两种方法呢。对,你说的没错,但是在面试的时候,有可能人家给你的数组就是排好序的,那么此时用二分查找法肯定要优于上面两种方法,所以这种方法最好也要掌握以下~

解法三:

class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int left = 0, right = nums.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > mid) right = mid;
else left = mid + 1;
}
return right;
}
};

在CareerCup中有一道类似的题,5.7 Find Missing Integer 查找丢失的数,但是那道题不让我们直接访问整个int数字,而是只能访问其二进制表示数中的某一位,强行让我们使用位操作Bit Manipulation来解题,也是蛮有意思的一道题。

最新文章

  1. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
  2. jQuery模仿淘宝商品评价
  3. C# 面试宝典
  4. weblogic的jar包冲突
  5. BZOJ 3260 跳
  6. Android 动态刷新listview中的数据
  7. Append加载动态轮播
  8. 假设动态运行java文字,当在脚本式配置,这是非常方便的
  9. 【UWP】拖拽列表项的排序功能实现
  10. Dockerfile 最佳实践
  11. Java面向对象(二、继承)
  12. 学习笔记TF065:TensorFlowOnSpark
  13. netty 学习(1)
  14. pring Boot 与Spring Cloud版本对应
  15. Go语言之进阶篇文件传输
  16. 【整理】Virtualbox中的网络类型(NAT,桥接等),网卡,IP地址等方面的设置
  17. ppt 文字按笔画进入。
  18. Ubuntu 16.04安装uafred用于替代Alfred
  19. jquery.form.js ie 下下载文件已经ie8失效问题解决方案
  20. Rocchio算法

热门文章

  1. mongodb 最佳可视化工具mongobooster
  2. 20145206邹京儒MSF基础应用
  3. VS编译duilib项目时候的错误解决方法整理(转载)
  4. js媒体查询设置根字号
  5. [Shiro] - shiro之SSM中的使用
  6. Hadoop Hive概念学习系列之hive里的分区(九)
  7. [loss]Triphard loss优雅的写法
  8. (转)Linux I/O 调度方法
  9. Python time模块详解--转载
  10. Python matplot画散列图