LeetCode-----算法448.找到所有数组中消失的数字
题目:
给定一个范围在 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.找到所有数组中消失的数字的更多相关文章
- 力扣(LeetCode)448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使 ...
- Java实现 LeetCode 448 找到所有数组中消失的数字
448. 找到所有数组中消失的数字 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间 ...
- Leetcode 448.找到所有数组中消失的数字
找到所有数组中消失的数字 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现 ...
- [LeetCode] 448. 找到所有数组中消失的数字(思维)
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...
- [LeetCode] 448. 找到所有数组中消失的数字 ☆
描述 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...
- 448 Find All Numbers Disappeared in an Array 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字.您能在不使用 ...
- 【leetcode 简单】 第一百零八题 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...
- [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 ...
- Leetcode448.Find All Numbers Disappeared in an Array找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...
随机推荐
- python提示警告InsecureRequestWarning
在Python3中使用以下代码报错: import requests response = requests.get(url='', verify=False) 错误代码如下: InsecureReq ...
- Python2.7-copy
copy 模块,python 中的‘=’是使左边的对象成为右边对象的一个引用,对不可变对象(如数字,字符串等)使用‘=’一般不会出现问题,但当对字典,列表等可变对象进行‘=’操作时,要注意修改其中一个 ...
- JAVA 框架 springmvc controller的返回值
一.返回值:ModleView对象. 使用modelAndView.setViewName设置返回的页面.使用modelAndView.addObject设置返回的数据. @RequestMappin ...
- 编程检查d:\test.txt文件是否存在,若在则显示该文件的名称和内容。
下面放两种方法 老师写的: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- zabbix items 配置
item是什么?它是我们对于host监控的基本条目,它属于不同的applications中,item的设置既可以针对具体的某个host主机,也可以针对模板进行设定(可以在多个主机进行复用). item ...
- 《Head First 设计模式》[01] 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- bat 栈上限
栈耗尽,递归会导致该问题. ****** B A T C H R E C U R S I O N exceeds STACK limits ******Recursion Count=1240, St ...
- struts2_maven_learning
以下为学习maven struts2 的学习过程,现记录如下. 1.创建一个完善的maven程序 maven:(jar) 1)maven project 2)facet 3)pom.xml,depen ...
- Android应用安全之脆弱的加密
程序员希望通过加密来提升程序的安全性性,但却缺乏专业的密码学背景知识,使得应用对数据的保护非常薄弱.本文将介绍可能出现在Android应用中的一些脆弱的加密方式,以及对应的攻击方法. 造成脆弱加密的主 ...
- jq 在字符串中,去掉指定的元素
例: var arr= ["4.5岁", "3.5岁", "5.5岁", "5岁", "4岁"] v ...