lintcode 中等题:find the missing number 寻找缺失的数
题目
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。
N = 4 且序列为 [0, 1, 3] 时,缺失的数为2。
可以改变序列中数的位置。
在数组上原地完成,使用O(1)的额外空间和O(N)的时间。
解题
重新定义一个数组存放排序后的数,空间复杂度和时间复杂度都是O(N)
public class Solution {
/**
* @param nums: an array of integers
* @return: an integer
*/
public int findMissing(int[] nums) {
// write your code here
boolean[] A = new boolean[nums.length +1];
for(int i = 0;i<nums.length; i++){
A[nums[i]] = true;
}
int n = 0;
for(int i = 0;i< A.length ;i++){
if(A[i] == false){
n = i;
break;
}
}
return n;
}
}
Java Code
总耗时: 1674 ms
class Solution:
# @param nums: a list of integers
# @return: an integer
def findMissing(self, nums):
# write your code here
A = [False]*(len(nums) + 1)
for a in nums:
A[a] = True
for i in range(len(A)):
if A[i] == False:
return i
Python Code
总耗时: 276 ms
在下面的挑战中,说可以在原始数组上面操作,如何在原始数组上面操作?空间复杂度并且是O(1)
i^i = 0 一个数自身的异或等于0
这个可以空间复杂可以是O(1),就有下面的代码了
public class Solution {
/**
* @param nums: an array of integers
* @return: an integer
*/
public int findMissing(int[] nums) {
// write your code here
int res = 0;
for( int i =0;i< nums.length ;i++){
res = res ^ nums[i] ^ i;
}
res = res^(nums.length);
return res;
}
}
Java Code
总耗时: 1802 ms
class Solution:
# @param nums: a list of integers
# @return: an integer
def findMissing(self, nums):
# write your code here
res = 0
for i in range(len(nums)):
res = res ^ i ^ nums[i]
res ^= len(nums)
return res
Python Code
总耗时: 297 ms
在书影博客中看到通过求和来找缺失的数,我都被这个机智的方法吓到了,竟然如此如此的机智
直接复制其代码:
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
return n * (n + 1) / 2 - sum(nums)
看到一个很牛逼的方法
在原始数组上,把A[i] 调整到其原来的位置 是的A[i] = i ,结束的地方就是当A[i] <0 此题目没有负数也没有影响的,A[i]>=n 显然的A[n]越界了。
以下面例子进行解释
[9,8,7,6,2,0,1,5,4],是长度为9的数组,按照题目的要求应该是0到9十个数字,找出缺失的那一个。
第0下标,9>=9 不做交换,下面的输出是只对交换的情况,在输出当前交换前和交换后的情况 ,黄色标记是交换的两个元素
第1下标,A[1]!=1 A[1]与A[A[1]]进行交换,即 8 4交换
before: [9, 8, 7, 6, 2, 0, 1, 5, 4]
later: [9, 4, 7, 6, 2, 0, 1, 5, 8]
交换后的A[1]依旧不等于1,继续A[1]与A[A[1]]交换,即 4 2 交换
before: [9, 4, 7, 6, 2, 0, 1, 5, 8]
later: [9, 2, 7, 6, 4, 0, 1, 5, 8]
2 7 进行交换
before: [9, 2, 7, 6, 4, 0, 1, 5, 8]
later: [9, 7, 2, 6, 4, 0, 1, 5, 8]
7 5 进行交换
before: [9, 7, 2, 6, 4, 0, 1, 5, 8]
later: [9, 5, 2, 6, 4, 0, 1, 7, 8]
5 0 进行交换
before: [9, 5, 2, 6, 4, 0, 1, 7, 8]
later: [9, 0, 2, 6, 4, 5, 1, 7, 8]
9 0 进行交换
before: [9, 0, 2, 6, 4, 5, 1, 7, 8]
later: [0, 9, 2, 6, 4, 5, 1, 7, 8]
此时A[1]>=n 不进行交换
第2下标,A[2]=2不进行交换
第3下标,A[3]!=3,6 1 进行交换
before: [0, 9, 2, 6, 4, 5, 1, 7, 8]
later: [0, 9, 2, 1, 4, 5, 6, 7, 8]
1 9 进行交换
before: [0, 9, 2, 1, 4, 5, 6, 7, 8]
later: [0, 1, 2, 9, 4, 5, 6, 7, 8]
以后的下标都和其元素值相等,不需要交换 下面只需要遍历数组,找出下标和值不相等的点即可,当都满足的时候,说明是n值不在数组中
说明下,中间有个缺失的数,那么一定有个其他数字占据了他的位置,找到这个位置就是答案了。
可以看出在一次交换时候,至少把一个元素调整到其所在的下标位置,也就是A[tmp] = tmp 这个元素 ,而A[i] = A[tmp]之前的元素的值,不能保证每次都使得自己的元素回到自己的位置,所以要用while多次循环。
如下,好好体会:
public class Solution {
/**
* @param A: an array of integers
* @return: an integer
*/
public int findMissing(int[] A) {
// write your code here
int n = A.length;
for(int i = 0;i< n;i++){
while( A[i] != i){
if(A[i] <0 || A[i] >= n)
break;
int tmp = A[i];
A[i] = A[tmp];
A[tmp] = tmp;
}
}
for(int i =0;i <n;i++){
if(A[i] !=i)
return i;
}
return n;
}
}
总耗时: 2141 ms
class Solution:
# @param A: a list of integers
# @return: an integer
def findMissing(self, A):
# write your code here
n = len(A)
if A == None or n == 0:
return 0
# num0 = A
for i in range(n):
while A[i] != i:
# num0 = A[:]
if A[i]<0 or A[i]>=n:
break
tmp = A[i]
A[i] = A[tmp]
A[tmp] = tmp
# if n > 6:
# print 'before:',num0
# print ' later:',A for i in range(n):
if A[i]!=i:
return i
return n
Python Code
总耗时: 352 ms
lintcode 中等题:find the missing number 寻找缺失的数的更多相关文章
- Missing number - 寻找缺失的那个数字
需求:给出一个int型数组,包含不重复的数字0, 1, 2, ..., n:找出缺失的数字: 如果输入是[0, 1, 2] 返回 3 输入数组 nums = [0, 1, 2, 4] :应该返回 3 ...
- lintcode 中等题:majority number III主元素III
题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...
- lintcode 中等题:Majority number II 主元素 II
题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...
- lintcode 中等题:Letter Combinations of a Phone Number 电话号码的字母组合
题目 电话号码的字母组合 给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合. 下图的手机按键图,就表示了每个数字可以代表的字母. 样例 给定 "23" 返回 [& ...
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- lintcode 中等题:Singleton number II 落单的数 II
题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...
- lintcode 中等题:Submatrix sum is 0 和为零的子矩阵
和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- lintcode 中等题:partition array 数组划分
题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...
随机推荐
- android Timer and TImerTask
android Timer and TImerTask Caused by: java.lang.IllegalStateException: TimerTask is scheduled alrea ...
- [大牛翻译系列]Hadoop(14)MapReduce 性能调优:减小数据倾斜的性能损失
6.4.4 减小数据倾斜的性能损失 数据倾斜是数据中的常见情况.数据中不可避免地会出现离群值(outlier),并导致数据倾斜.这些离群值会显著地拖慢MapReduce的执行.常见的数据倾斜有以下几类 ...
- 如何去掉html中的超链接
$a= preg_replace("/<a[^>]+>/", "", $a); $a= preg_replace("/<\/a ...
- Messages.pas里的消息
一.Windows 消息大全 这张表拷贝自万一兄的帖子:http://www.cnblogs.com/del/archive/2008/02/25/1079970.html 但是我希望自己能把这些消息 ...
- Python-Day3 Python基础进阶之集和/文件读写/函数
一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...
- openerp学习笔记 错误、警告、提示、确认信息显示
1.检查业务逻辑中的错误,终止代码执行,显示错误或警告信息: raise osv.except_osv(_('Error!'), _('Error Message.')) 示例代码: #删除当前销售单 ...
- eclipse增加浏览器chrome
1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...
- Python标准库 urllib2 的使用
1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy,而不受环境变量的影响,可以使用下面的方式 impo ...
- iOS定位服务编程详解
现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 i ...
- Qt版helloworld
跟学别的编程语言一样,Qt也不例外,一开始就想写一个helloworld.初学Qt十几天,看了一点关于Qt视频的介绍和书上的基础知识,对于Qt写工程的概念有了初步的认识,就代码的形式来说,Qt Cre ...