[LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字
题目描述
给定n个数字的数组,里面的值都是1-n,但是有的出现了两遍,因此有的没有出现,求没有出现值这个数组中的值有哪些。
要求不能用额外的空间(除了返回列表之外),时间复杂度n
思路
因为不能用额外空间并且时间是O(n),所以不能用排序或者hash
通过在对应位置的值去确定下一个位置,一直到遍历完。其实自己也没有很成熟的思想。
比如对于[4,3,2,7,8,2,3,1]:
A[0],4=>找到a[3],7=>a[6],3=>a[2]====注意有可能出现循环,行不通。
本来以为行不通,后来经过思考,可以行得通,只不过复杂度是O(k*n),k是重复的数字的个数,也是缺少的数字的个数。思路是这样的A[0],4,并且把A[0]标记为-1=>a[3],7并把4放到a[3]=>a[6],3,把7放到a[6],=>a[2],2,把3放到a[2]=>a[1],3,把2放到a[3],===>想把3放到a[2],只是a[2]已经=3,所以3是数组中重复的。一个循环结束,从A[0]又开始,找到!=-1,并且!=i+1的a[i],把里面的值放到对应的位置上。一直到所有位置不是-1就是i+1结束。位置是-1的,对应空缺数值i+1。
代码
public static List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> result=new ArrayList<>();
boolean isEnding=false;//用isEnding检查是否所有位置不是-1就是i+1
boolean isExist=false;//是否从上一个位置取出了数字
int i=0;//代表找到的位置
while(!isEnding){
isEnding=true;
i=0;
while(i<nums.length){
if((nums[i]!=i+1)&&(nums[i]!=-1)){//没有重复,可以放进去
isEnding=false;
int tmp=nums[i];
if(isExist){//如果有可以放进去的值,就先取出来再放进去
nums[i]=i+1;
}else{//否则,只能取出来,并把-1放进去
nums[i]=-1;
}
i=tmp-1;
isExist=true;
}else{//如果相等,那么就重复了不需要放进去,直接往前面去;碰到了-1,如果需要放进去,就先放进去,再往后面去
if(isExist&&nums[i]==-1){
nums[i]=i+1;
}
i++;
isExist=false;
}
}
}
for(i=0;i<nums.length;i++){
if(nums[i]==-1){
result.add(i+1);
}
}
return result;
}
分析
看了看solution,是把所有的对应值的对应位置上的值都置为相反数:nums[|nums[i]| -1] = -|nums[|nums[i]|-1]|,如果第二次遍历发现它>0,那么它是没见过的。比如[4,3,2,7,8,2,3,1],遍历一遍之后,得到[-4,-3,-2,-7,8,2,-3,-1],所以是8、2对应位置的数值没有在数组出现过,也就是5,6
[LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字的更多相关文章
- LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能 ...
- LeetCode 448. 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 ...
- leetcode 448. Find All Numbers Disappeared in an Array -easy (重要)
题目链接: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/ 题目描述: Give ...
- 448 Find All Numbers Disappeared in an Array 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字.您能在不使用 ...
- LeetCode "448. Find All Numbers Disappeared in an Array"
My first reaction is to have an unlimited length of bit-array, to mark existence. But if no extra me ...
- 5. Leetcode 448. 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 ...
- LeetCode 448 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 a ...
- LeetCode: 448 Find All Numbers Disappeared in an Array(easy)
题目: Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice an ...
- 【leetcode】448. Find All Numbers Disappeared in an Array
problem 448. Find All Numbers Disappeared in an Array solution: class Solution { public: vector<i ...
随机推荐
- C#最大值
dtToSList = sqlAccess.ExecuteTable(CommandText); ToSNo = Convert.ToString(dtToSList.Rows[i].ItemArra ...
- 【Python机器学习实战】聚类算法(1)——K-Means聚类
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
- Hadoop【MR的分区、排序、分组】
[toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...
- [项目总结]关于调用系统照相机Activity被销毁问题解决
在项目中需要启用系统照相机来拍照.本来很容易的一个问题.但在适配中出现了问题. 简单说一下问题: 有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了. 问题查找: 经过代码 ...
- JPA和事务管理
JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理.如果在依赖注入容器之外使用JPA,事务处理必须由开发人员编程实现. 123456789101112UserTransacti ...
- ANTLR 环境准备
基本环境: JDK8 Maven IntelliJ IDEA IntelliJ IDEA中安装ANTLR v4插件 在IntelliJ IDEA插件仓库中搜索ANTLR v4插件并安装,如下图: 看个 ...
- EFK的安装和收集docker容器日志展示
在用户根目录创建个filebeat.docker.yml文件,文件内容如下 filebeat.config: modules: path: ${path.config}/modules.d/*.yml ...
- MySQL数据库如何查看数据文件的存放位置
SHOW GLOBAL VARIABLES;
- SQLserver 2014 如何使用Datename()函数获取对应时间
一.在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 二.用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可 ...
- typescript接口---interface
假如我现在需要批量生产一批对象,这些对象有相同的属性,并且对应属性值的数据类型一致.该怎么去做? 在ts中,因为要检验数据类型,所以必须对每个变量进行规范,自然也提供了一种批量规范的功能.这个功能就是 ...