题目

给出一个包含 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 寻找缺失的数的更多相关文章

  1. Missing number - 寻找缺失的那个数字

    需求:给出一个int型数组,包含不重复的数字0, 1, 2, ..., n:找出缺失的数字: 如果输入是[0, 1, 2] 返回 3 输入数组 nums = [0, 1, 2, 4] :应该返回 3 ...

  2. lintcode 中等题:majority number III主元素III

    题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...

  3. lintcode 中等题:Majority number II 主元素 II

    题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...

  4. lintcode 中等题:Letter Combinations of a Phone Number 电话号码的字母组合

    题目 电话号码的字母组合 给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合. 下图的手机按键图,就表示了每个数字可以代表的字母. 样例 给定 "23" 返回 [& ...

  5. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  6. lintcode 中等题:Singleton number II 落单的数 II

    题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...

  7. lintcode 中等题:Submatrix sum is 0 和为零的子矩阵

    和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...

  8. lintcode 中等题:N Queens II N皇后问题 II

    题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...

  9. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

随机推荐

  1. DevExpress控件水印文字提示

    ButtonEdit.Properties.NullValuePrompt = "提示"; ButtonEdit.Properties.NullValuePromptShowFor ...

  2. SharedPreferences的基本用法

    获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法 2 调用Activity对象的getPreferences()方法 两 ...

  3. Amazon S3 PHP Class Documentation

    API : http://undesigned.org.za/2007/10/22/amazon-s3-php-class/documentation Example: http://www.phpb ...

  4. (原创)LINUX_UNIX设计思想-读书笔记

    第一章 一.Unit哲学 1.小即是美 2.让每一个程序只做好一件事情 3.尽快建立原型 4.舍高效率而取可移植性 5.使用纯文本文件来存储数据 6.充分利用软件的杠杆效应 7.使用shell脚本来提 ...

  5. XHTML1.0对HTML4.0的改进

    1.XHTML借鉴了XML的写法,语法更加严格: 2.XHTML实现了把页面样式和内容分离了,废弃了HTML4.0中表示样式的标签和属性,推荐使用CSS样式来描述页面的样式. XHTML1.0 分为两 ...

  6. C# 文件管理类 Directory

    今天简单接触了一下C#的文件管理类,对类的大体功能做了简单的了解; 做项目用于判断文件是否存.在创建文件.删除文件较为常用:今天大体总结文件调取功能: public string GetFile() ...

  7. Azure Bill

    MSDN的本月订阅的被用完了,所有的付费订阅均变成了不可用的状态. 信用额度为0元,还有2天能恢复 点击上方的MSDN订阅名会进入更加详细的账单,账单以月的形式提供. 邮件中也会通知您到了限定额度所停 ...

  8. 【转载】Powershell获取世纪互联Office365中所有用户的OWA时区

    get-mailbox -resultsize unlimited | Get-MailboxRegionalConfiguration | select Identity,TimeZone | wh ...

  9. EAI概述

    企业的业务流程同时会涉及多个应用系统,因此要求这些系统能够协同,但接口,架构的不统一往往使得这些本应紧密集成的应用系统成了一个个“信息孤岛”.于是,企业应用集成(Enterprise Applicat ...

  10. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表中的标识列指定显式值

    今天在处理数据时遇到这样一个错误 消息 8101,级别 16,状态 1,第 1 行 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'dbo.StockDetailValu ...