Lintcode196 Find the Missing Number solution 题解
发布在LINTCODE2018年2月2日view:289移动开发
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

【题目描述】

Given an array contains N numbers of 0 ..N, find which number doesn’t exist in the array.

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

【题目链接】

www.lintcode.com/en/problem/find-the-missing-number/

【题目解析】

最直观的思路是对数据进行排序,然后依次扫描,便能找出漏掉的数字,但是基于比较的排序算法的时间复杂度至少是nlog(n),不满足题目要求。

一种可行的具有线性时间复杂度的算法是求和。对0到n求和,然后对给出的数组求和,二者之差即为漏掉的数字。但是这种方法不适用于0是漏掉的数字的情况,因为此时两个和是相同的。(或者也能由此得出漏掉的数字是0)

从CPU指令所耗费的时钟周期来看,比加法更高效率的运算是异或(XOR)运算。本题的标签里有位运算,暗示本题可以用位运算的方法解决。

异或运算的一个重要性质是,相同的数异或得0,不同的数异或不为0,且此性质可以推广到多个数异或的情形。本题的解法如下,首先将0到n这些数进行异或运算,然后对输入的数组进行异或运算,最后将两个结果进行异或运算,结果便是漏掉的数字,因为其他数字在两个数组中都是成对出现的,异或运算会得到0。

【参考答案】

www.jiuzhang.com/solutions/find-the-missing-number/

评论
发表评论
暂无评论
WRITTEN BY
PUBLISHED IN

我的收藏