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; 通常情况…

堆的构建、堆的插入、堆的删除、堆排序

如果你不了解堆是如何构建、插入、删除、堆排序的原理,可以点击下面连接,有详细的图解,让你知道逻辑原理。 http://blog.csdn.net/u011068702/article/details/52712634 最详细的最小堆构建、插入、删除的过程图解 http://blog.csdn.net/u011068702/article/details/…

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;而…

贪心算法之最小堆实现霍夫曼编码

贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆、堆的插入、堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/details/52712634 最详细的最小堆构建、插入、删除的过程图解 http://blog.csdn.net/u011068702/artic…

react学习系列之states与props

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

用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…

求字符串里里面字符出现的次数和出现哪些不同的字符的字符串

题目: 字符串里里面字符出现的次数和出现哪些不同的字符 such as 字符串“aaaabbbccd” 打印出出现a4次,b3次,c2次,d1次,出现的不同字符的字符串为“abcd”,或者按照规则打印字符串“4a3b2c1d” 代码: #include <stdio.h> #include <stdlib.h> #include &l…

[20140928]创建连接到MySQL的连接服务器

[20140928]创建连接到MySQL的连接服务器 首先要安装 mysql odbc然后 odbc下创建DSN&#xff0c;并且要在系统DSN下。最后执行exec sp_addlinkedserverserver XY,--这是链接服务器的名称srvproduct mysql,--这个你自己随便吧provider MSDASQL,--这是固定的&#xff0c;不能瞎填&…

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

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

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

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

[LeetCode]--20. Valid Parentheses

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not. public boo…

人生如梦

人生就像一场虚无的梦&#xff0c;可是我已经醒了&#xff0c;我只想过得真实一点

C语言atoi()函数:将字符串转换成int(整数)和sprintf和memset

atoi()函数 #include <stdio.h> #include <stdlib.h>int main () {int i;char buffer[256];printf ("Enter a number: ");fgets (buffer, 256, stdin);i atoi (buffer);printf ("The value entered is %d.", i);system("pause");re…