当前位置: 首页 > news >正文

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

 

 

转载于:https://www.cnblogs.com/theskulls/p/4943680.html

相关文章:

  • Myeclipse使用DB Browser连接数据库错误:OPTION SQL_SELECT_LIMIT=DEFAULT
  • C语言如何清除scanf()缓存
  • 通过XmlDocument读写Xml文档参考地址
  • Myeclipse使用hibernate的逆向工程
  • brew 更新
  • 安装vmare-tools——实现ubuntu与windows的互相复制与粘贴(无需共享文件夹)
  • SSH开发中解决mysql数据库的乱码问题
  • 靠谱助手 BlueStacks
  • 自定义日期类型转换器
  • JDK环境变量详细讲解
  • 2014年末最强悍IT学习视频教程分享
  • 搭建CAS单点登录服务器
  • Android应用开发相关下载资源(2014/12/14更新)
  • 在SQL Server中为什么不建议使用Not In子查询
  • Eclipse+超快的模拟器Genymotion开发Android应用(第一步:安装及配置Genymotion)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2017前端实习生面试总结
  • ECMAScript6(0):ES6简明参考手册
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTML-表单
  • JDK9: 集成 Jshell 和 Maven 项目.
  • React的组件模式
  • REST架构的思考
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给第三方使用接口的 URL 签名实现
  • 前端面试题总结
  • 驱动程序原理
  • 入口文件开始,分析Vue源码实现
  • 通过几道题目学习二叉搜索树
  • 微信小程序开发问题汇总
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 如何在招聘中考核.NET架构师
  • ​io --- 处理流的核心工具​
  • ​批处理文件中的errorlevel用法
  • # Maven错误Error executing Maven
  • #define、const、typedef的差别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (ibm)Java 语言的 XPath API
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十五)使用Nexus创建Maven私服
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .apk文件,IIS不支持下载解决
  • .NET 发展历程
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net6 Api Swagger配置
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • [2544]最短路 (两种算法)(HDU)
  • [Android]How to use FFmpeg to decode Android f...