题目:

给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

输入:
[,,,,,,,] 输出:
[,]

<分析>

  1.     1 ≤ a[i] ≤ n ( n = 数组大小 )

  2.     数组中的元素一些出现了两次,另一些只出现一次

解法一:

  可以考虑将数组a中的出现的元素k放到数组a第k个位置,即a[k-1]单元.。 如此,数组a中下标+1(i+1)与元素a[i]不相等则代表i+1未出现过。

函数如下:

    public static List<Integer> findDisappearedNumbers(int[] nums) {
int i, k;
List<Integer> L = new ArrayList<>(); for(i = 0; i < nums.length; i++){
if(nums[i] != nums[nums[i] - 1]){
k = nums[i];
nums[i] = nums[k - 1];
nums[k - 1] = k;
i--;
}
}
for(i = 0; i < nums.length; i++){
if(i != nums[i] - 1)
L.add(i+1);
} return L;
}

 解法二:

  1-n的数字可能出现也可能不出现,可以想一种方法标记两种状态。数组中元素均大于0,考虑如果数组a[]中包含k,则可以将a[k-1]取-|a[k-1]|。这样遍历完数组a[]后,a[i]>0,则代表i+1未出现。

函数如下:

public static List<Integer> findDisappearedNumbers(int[] nums) {
int i, k;
List<Integer> L = new ArrayList<>(); for(i = 0; i < nums.length; i++){
k = nums[i] > 0 ? nums[i] : -nums[i];
nums[k - 1] = nums[k - 1] > 0 ? -nums[k - 1] : nums[k - 1]; } for(i = 0; i < nums.length; i++){
if(nums[i] > 0)
L.add(i+1);
} return L;
}

解法三:

  与解法二类似,可以采用其他方式标记。若k在数组a[]中出现,可以让a[k-1]加上n。这样,如果a[i]<=n则代表i+1未出现。

代码如下:

public static List<Integer> findDisappearedNumbers(int[] nums) {
int i, k;
List<Integer> L = new ArrayList<>(); for(i = 0; i < nums.length; i++){
k = nums[i] % nums.length;
if(k == 0)
k = nums.length;
nums[k - 1] += nums.length;
} for(i = 0; i < nums.length; i++){
if(nums[i] <= nums.length)
L.add(i+1);
} return L;
}

LeetCode-----算法448.找到所有数组中消失的数字的更多相关文章

  1. 力扣(LeetCode)448. 找到所有数组中消失的数字

    给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使 ...

  2. Java实现 LeetCode 448 找到所有数组中消失的数字

    448. 找到所有数组中消失的数字 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间 ...

  3. Leetcode 448.找到所有数组中消失的数字

    找到所有数组中消失的数字 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现 ...

  4. [LeetCode] 448. 找到所有数组中消失的数字(思维)

    题目 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...

  5. [LeetCode] 448. 找到所有数组中消失的数字 ☆

    描述 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...

  6. 448 Find All Numbers Disappeared in an Array 找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字.您能在不使用 ...

  7. 【leetcode 简单】 第一百零八题 找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...

  8. [Swift]LeetCode448. 找到所有数组中消失的数字 | Find All Numbers Disappeared in an Array

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  9. Leetcode448.Find All Numbers Disappeared in an Array找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...

随机推荐

  1. JQuery 为radio赋值问题

    今天用jquery 为radio赋值,从百度查了一下方法: $("input[name='radioName'][value=2]").attr("checked&quo ...

  2. 随手练——ZOJ 1093 Monkey and Banana(动态规划)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=93 一堆科学家研究猩猩的智商,给他M种长方体,每种N个. 然后,将一个 ...

  3. etcd管理

    操作etcd有命令行工具etcdctl,有两个api版本互不兼容的,系统默认的v2版本,kubernetes集群使用的是v3版本,v2版本下是看不到v3版本的数据的,我也是找了些资料才了解这个情况. ...

  4. 魔法少女【动态规划问题】——NYOJ1204

    个人博客页:https://www.scriptboy.cn/202.html 题目描述: 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙 ...

  5. docker swarm英文文档学习-6-添加节点到集群

    Join nodes to a swarm添加节点到集群 当你第一次创建集群时,你将单个Docker引擎置于集群模式中.为了充分利用群体模式,可以在集群中添加节点: 添加工作节点可以增加容量.当你将服 ...

  6. maven项目中,lib目录下有自己私有的包,则需要配置一下代码,然后进行打包

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compi ...

  7. shiro实战系列(八)之安全管理器

    Apache Shiro 提供安全框架界独一无二的东西:一个完整的企业级 Session 解决方案,从最简单的命令行及智能手机 应用到最大的集群企业 Web 应用程序.   这对许多应用有着很大的影响 ...

  8. 信号处理开源库SP++介绍

    SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源 C++程序库,该库提供了信号处理与数值计算中常用算法的 C++实现.SP++中所有算法都以 C++类 ...

  9. sql语句截取字符串

    Postgresql 当中有四种方式获取当前时间.  一:now()      通过now()获取的时间是最完整的时间,包括时区,秒也保留到了6位小数.      select now();     ...

  10. BQMeetup

    BQMeetup 时间:2017.12.19 地点:北京东城区东直门国华投资大厦1105