bat从数组中找出相同数字并删除_找到所有数组中消失的数字

题目描述

给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

输入:[4,3,2,7,8,2,3,1]
输出:[5,6]

题解

注意题目要求不能使用额外空间,这就是题目的难点所在。
这道题的描述部分包含了一个非常重要的信息,1 ≤ a[i] ≤ n,即每个数字本身都对应一个i-1的数组下标。我们可以利用数组内容本身跟数字下标的关联找出缺失的数字。

扫描两遍数组:

  • 第一遍,将所有数字做标记
  • 第二遍,根据标记信息找出缺失的数字。

下面来看详细分析
假设有数组[1,2,3,4,5,6]
这个数组是有序的,而且也没有缺失数字,范围是[1,6]
仔细看,数组中的每个元素,其实和数组下标是有一一对应关系的

9ec8e0b9d73b1d042228c0b79fc6033c.png

这里的对应关系就是:

  • 数组值1对应下标0
  • 数组值2对应下标1
  • 数组值3对应下标2
  • 数组值4对应下标3
  • 数组值5对应下标4
  • 数组值6对应下标5

也就是数组下标+1正好等于 数组中的值

如果是一个乱序的数组会怎样呢?
假设数组是[5,4,6,3,1,2],范围是[1,6],也没有缺失数字

b2cdf54e26c9b58eb7113bb3ec43125e.png

这里仍然有一一对应关系:

  • 数组值5对应下标4
  • 数组值4对应下标3
  • 数组值6对应下标5
  • 数组值3对应下标2
  • 数组值1对应下标0
  • 数组值2对应下标1

没有缺失数字的情况下,不管是有序的、还是乱序的,都跟下标有一一对应关系。

现在我们来分析一个缺失数字的例子
假设有数组[1,2,3,4,6,6]缺少数字5

f2a7a8e7dbe7a3a539d6bb4211d1f185.png

我们用下标对应的这么一层关系,将数组重写一遍

  • 第一个值是1,对应下标是0,将arr[0]设置为-arr[0],即-1
  • 第二个值是2,对应下标是1,将arr[1]设置为-arr[1],即-2
  • 第三个值是3,对应下标是2,将arr[2]设置为-arr[2],即-3
  • 第四个值是4,对应下标是3,将arr[3]设置为-arr[3],即-4
  • 第五个值是6,对应下标是5,将arr[5]设置为-arr[5],即-6
  • 第六个值是6,对应下标是5,将arr[5]设置为-arr[5],即-6

第五个、第六个值相同,他们修改的是同一个下标,都将arr[5]改了一次
但是arr[4]这个位置没动过
重写了一遍数组之后,数组就变成了这个样子:

e9830ca4ee37171ce86023eadb0ac3b9.png

由于下标4应该对应数字5,现在缺少了这个值,所以没人设置这个位置,于是第一遍处理完后,只有下标4这个位置的值是正数,其他位置的全部都是负数。
这就好办了,我们遍历一遍数组,找到大于0的数,这个数是6,对应下标是4,所以缺失的数字是5

最后再看一个更复杂的例子
数组[4,3,2,7,8,2,3,1],缺少5,6两个数字

da10039df1bd1af2a28d56010e795889.png

我们来看下第一趟的处理过程:

  • 第一个数字是4,对应下标3,将arr[3]设置为-7
  • 第二个数字是3,对应下标2,将arr[2]设置为-2
  • 第三个数字是2,对应下标1,将arr[1]设置为-3
  • 第四个数字是7,对应下标6,将arr[6]设置为-3
  • 第五个数字是8,对应下标7,将arr[7]设置为-1
  • 第六个数字是2,对应下标1,将arr[1]设置为-3
  • 第七个数字是3,对应下标2,将arr[2]设置为-2
  • 第八个数字是1,对应下标0,将arr[0]设置为-4

第一趟处理完了之后,我们开始第二趟扫描,也就是上图中第二个数组
这个数组中8,2两个元素是大于0的
8对应下标4,所以4+1,即缺少5这个数字
2对应下标5,所以5+1,即缺少6这个数字

时间复杂度:O(N)
空间复杂度:O(1)

java代码:

class Solution {
    public List findDisappearedNumbers(int[] nums) {
        List res = new ArrayList();//第一遍扫描,根据数组的值找到对应的下标,比如3对应下标2//将arr[2]设置成负数for(int i=0;i            int index = Math.abs(nums[i])-1;if(nums[index]>0) {
                nums[index] *= -1;
            }
        }//第二遍扫描,找到所有非负数,非负数所在的下标+1,即为缺失的数字for(int i=1;i<=nums.length;++i) {if(nums[i-1]>0) {
                res.add(i);
            }
        }return res;
    }
}

python代码:

class Solution(object):
    def findDisappearedNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        res = []
        # 第一遍扫描,根据数组的值找到对应的下标,比如3对应下标2
        # 将arr[2]设置成负数
        for i in nums:
            index = abs(i)-1
            if nums[index]>0:
                nums[index] *= -1
        # 第二遍扫描,找到所有非负数,非负数所在的下标+1,即为缺失的数字
        for i in xrange(len(nums)):
            if nums[i]>0:
                res.append(i+1)
        return res
推荐阅读  点击标题可跳转

删除排序数组中的重复项

移动零

盛水最多的容器

看完本文有收获?请转发分享给更多人

221c14e7bc8ee75d8ebffe736d1b1ff9.png

好文章,我在看❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在IE11下设置SharePoint Server 2013却遇到“需要 Internet Explorer 才能使用此功能。”的解决办法...

就在昨天顺利升级到Windows 8.1 随之IE也升级到了IE11&#xff0c;但是当打开IE11设置SharePoint Server 2013的时候遇到了一些小情况&#xff1a; Figure 1使用Windows 8.1中的IE11设置SharePoint 2013 的时候遇到这样乌龙的事情 这个情况的原因是什么呢&#xff1f; 通常情况…

2分钟,我把网站性能优化了3倍!

大家好&#xff0c;我是鱼皮&#xff0c;最近有同学反映我做的 面试刷题网站 &#xff08;mianshiya.com&#xff09;页面加载速度有点慢&#xff0c;所以我决定先简单优化一下。其实我只做了 1 件小事&#xff0c;花了两分钟左右&#xff0c;就把网站的加载速度从 5 秒左右优化…

PHP: 深入了解一致性哈希

2019独角兽企业重金招聘Python工程师标准>>> 学习网址如下所示: http://www.frostsky.com/2014/03/php-consistenthash/ http://www.cnblogs.com/jackluo/archive/2013/06/27/3158847.html http://blog.csdn.net/cywosp/article/details/23397179/ 转载于:https://m…

开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]

转自&#xff1a;http://blog.sina.com.cn/hyiyun 近些天&#xff0c;有网友的电脑出现&#xff1a;开机后屏幕一片漆黑&#xff0c;但屏幕中央显示有鼠标指针&#xff0c;并且可移动。按键盘上的不论什么键都没有反应&#xff0c;鼠标也仅可移动&#xff0c;单、双击都无效。说…

java23种设计模式个人整理_java23种设计模式-行为型模式之模板方法模式

定义&#xff1a;Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure.定义一个操作中的算法的框架&#xff0c;而…

用VS studio 2008做sql server 报表出现乱码

找了半天&#xff0c;没有发现那里可以修改编码。后面又在网上搜索解决办法&#xff0c;答案少之又少&#xff0c;云里雾里。 后来在csdn上搜索到一片关于水晶报表的乱码解决方案&#xff0c;一试&#xff0c;同样可以解决。 其实并不是编码的问题, 而是因为所选字体不包含中文…

MASA Framework - 整体设计思路

源起年初我们在找一款框架&#xff0c;希望它有如下几个特点&#xff1a;学习成本低只需要学.Net每年主推的技术栈和业务特性必须支持的中间件&#xff0c;给开发同学减负&#xff0c;只需要专注业务就好个人见解&#xff1a;一款好用的框架应该是补充&#xff0c;而不是颠覆或…

​怎么用藏头诗向女友表白......

1 遇到不好使的水龙头时▼2 今天去你家玩好不好&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 男朋友多会拍照&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 干饭人有多难▼5 麻将的内涵&#xff01;&#xff08;素材来源网络&#xff0c;侵删&…

cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号&#xff1a;OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题&#xff0c;问题是这样的&#xff0c;他有如下的一张二值图像&#xff1a;怎么得到白色Blob中心线&#xff0c;他希望的效果如下&#xff1a;显然Op…

又砸又烧,还要泼脏水,这谣言到底什么时候才没人信?发生这样的事真没想到.........

全世界只有3.14 % 的人关注了爆炸吧知识曾经看到一条新闻&#xff0c;说的是漂亮国人民怀疑口罩上的那个鼻梁条是5G天线&#xff0c;它不仅能控制人&#xff0c;还能致癌。“所以这就是他们计划杀死我们的方式&#xff0c;他们把5G电线放在了这里&#xff0c;就在这。”一名女子…

如何使用ASP.NET Core Web API实现短链接服务

前言在前面的文章中&#xff0c;我们介绍了hashids.net&#xff0c;可以将数值型Id加密成无意义的字符串。今天&#xff0c;我们来利用这一特点&#xff0c;实现短链接服务。原理短链接&#xff0c;顾名思义就是在形式上比较短的链接网址。借助短链接&#xff0c;可以用简短的网…

python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据

最近工作中&#xff0c;要整理数据&#xff0c;本来是以sql脚本录入&#xff0c;但是id、barcode等数据不好整理&#xff0c;因为这几个字段要唯一。所以想到用EXCEL表整理数据&#xff0c;再导入数据库中。整理的过程中&#xff0c;发现EXCEL一行一行的修改也挺麻烦&#xff0…

ORACLE 数据库安装后,PL/SQL的登录问题完美解决

windows7 64位系统 安装完oracle 后的用法如下分享链接&#xff1a;http://www.2cto.com/database/201307/226853.html#comment_iframe安装完PL/SQL后 。当你登陆时。你会遇到各种那个疼的问题。 例如&#xff1a;监听程序在CONNECT_DATA 中未获得SERVICE_NA 无监听程序 无法解…

3、AngularJS2 架构

2019独角兽企业重金招聘Python工程师标准>>> Angular 2 应用程序应用主要由以下 8 个部分组成&#xff1a; 1、模块 (Modules)2、组件 (Components)3、模板 (Templates)4、元数据 (Metadata)5、数据绑定 (Data Binding)6、指令 (Directives)7、服务 (Services)8、依…

Kubernetes:实现应用不停机更新

本篇主要讨论如何实现滚动更新和回滚&#xff0c;任意更换版本并且回滚以前的版本(版本更新)&#xff0c;而下一章会讨论到 Pod 缩放&#xff0c;根据机器资源自动拓展和收缩应用(自动扩容实例)。本文为作者的 Kubernetes 系列电子书的一部分&#xff0c;电子书已经开源&#x…

inner join 和 exists 效率_一个in、exists、join的简单测试

创建两张表先单独插入两条数据然后批量插入部门号为10,20,30,40的数据各10499099条然后dept表也插些干扰数据测试语句开始验证in和exists和join 先比较个占比多的部门&#xff0c;再比较占比少的 1、 in 占比多 select count(*) from scott.EMP_TEST e where e.deptno in (sele…

httpModules 与 httpHandlers

httpModules 与 httpHandlers ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给ASPNET_ISAPI.dll&#xff0c;ASPNET_…