题目描述

给定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 找到数组中消失的数字的更多相关文章

  1. LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素

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

  2. 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 ...

  3. leetcode 448. Find All Numbers Disappeared in an Array -easy (重要)

    题目链接: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/ 题目描述: Give ...

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

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

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 【leetcode】448. Find All Numbers Disappeared in an Array

    problem 448. Find All Numbers Disappeared in an Array solution: class Solution { public: vector<i ...

随机推荐

  1. C语言中内存对齐与结构体

    结构体 结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充. struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 str ...

  2. lua table与json的之间的互相转换高性能c++实现

    请自行约束两种语言数据结构语法上的不同,避开如下问题: 1.json本身不约束key是否符合一个编程语言中的变量名,所以编写用于和编程语言数据结构交互的json代码时应该注意key是否正确. 2.lu ...

  3. 截取字符串、拼接字符串【c#】

    string compname="1与3"; String[] name = compname.Split('与'); string namer=name[0]; namer=1 ...

  4. 学习java的第八天

    一.今日收获 1.学习完全学习手册上2.3转义字符与2.4运算符两节 二.今日难题 1.没有什么难理解的问题 三.明日目标 1.哔哩哔哩教学视频 2.Java学习手册

  5. 日常Java 2021/11/21

    Java文档注释 Java支持三种注释方式.前两种分别是Ⅱ和/产*,第三种被称作说明注释,它以产开始,以*I结束.说明注释允许你在程序中嵌入关于程序的信息.你可以使用javadoc工具软件来生成信息, ...

  6. ceph对象存储场景

    安装ceph-radosgw [root@ceph-node1 ~]# cd /etc/ceph # 这里要注意ceph的源,要和之前安装的ceph集群同一个版本 [root@ceph-node1 c ...

  7. Oracle中常用的系统表

    1.dba开头的表 dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息 dba_tablespaces ...

  8. [项目总结]Android 手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) 1 InputMethodManager imm = (InputMethodManager) getSystemService(Cont ...

  9. java中super的几种用法,与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...

  10. Linux 网卡配置文件,命令详细设置

    1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...