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, ...
随机推荐
- DIV_ROUND_UP(x,y)实现x/y向上取整
#define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) 1.问题 x.y都是整数,且x > 1, y > 1,求 x / y的向上取整,即: ...
- php获取服务器时间的代码
php获取服务器时间的代码. 用php的date函数即可来获取服务器上的时间: <?php //将时区设置为中国 date_default_timezone_set("PRC&quo ...
- 分享:PHP数组排序总结
本文内容:PHP二维数组排序,PHP数组排序总结. php数组排序是PHP学习中最基础也是最重要的一部分. 1.常规数组的排序 常规数组是指数组各元素均为字符串或数字,这与这样的数组,我们可以采用so ...
- 一款jQuery立体感动态下拉导航菜单特效
一款jQuery立体感动态下拉导航菜单特效,鼠标经过,在菜单栏上方下拉出一个背景图片,效果十分不错的一款jquery特效. 对IE6都是兼容的,希望大家好好研究研究. 适用浏览器:IE6.IE7.IE ...
- apache http server 局域网无法访问
apache 本地配置完成测试成功,但局域网内无法访问. 1.主要是本本地的防火墙设置有关,修改防火墙设置就成了 控制面板->系统和安全->Windows 防火墙->允许程序通过Wi ...
- ASP.NET MVC4学习笔记路由系统概念与应用篇
一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...
- Delphi 两个应用程序(进程)之间的通信
两个应用程序之间的通信实际上是两个进程之间的通信.由于本人知识有限,决定应用消息来实现.需要用到的知识: 1.RegisterWindowMessage(); //参数类型:pchar:返回值:Lon ...
- Linux C C语言库的创建和调用
C语言库的创建和调用 简介: 假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方.每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降 ...
- 【CocoaPods】配置CocoaPods后 - CocoaPods使用
配置CocoaPods后 - CocoaPods使用 极速化 CocoaPods : 1 .使用淘宝 Ruby Gems 源(Cocoapods 使用 ruby 开发) gem sources -l ...
- hifi/ headphone test
https://www.youtube.com/watch?v=-r0gRjqN0N8 https://www.youtube.com/watch?v=sMh_zvCw6us