LeetCode448-找到所有数组中消失的数字(原地数组)

因为题目数组有范围1 ≤ a[i] ≤ n

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

就是说,这个数组,如果数字是全的话,应该可以表示为

[1,2,3,4,5,6..........,N]

有重复的数字,就是说一些位置上的数字被其他数字占了,那么把它回复原样,在看一下那些位置上的数字不对就行了。

一个数字应该在的index,是数字-1,比如1放在index0那。

一开始的想法是,从index0开始遍历,遇到和index不同的,就放到他应该在的位置 。

然后取出那个位置上的数字,继续放到它应该在的位置上,一直继续。知道这一轮数字都在他们应该在的位置了。

继续迭代index。

这样有个问题,好像有两个循环了。

改进的方法。

当然位置的数字,和他应该在的位置上的数字进行交换,index不变。

这样最外层的循环就会完成这个迭代了。

这种做法,竟然莫名其妙是对的!太强了!

就算一开始有些位置没有放到正确的数字,但是最后都会被换回去。

因为index到每个,位置,那个位置上的数字,都会被放到正确的位置。

var findDisappearedNumbers = function(nums) {

   let index = 0;
   while(index<nums.length){
    let temp = nums[index];
    // 如果这个数字在他对应的数字上
    if(temp == nums[temp-1]){
      //进行下一个位置的判断
      index++;
    }else{
      //es6的交换
      [nums[index],nums[temp-1]] = [nums[temp-1],nums[index]]
    }
   }

   let arr = [];

   //检查位置不对的数字
   for(let i=0;i<nums.length;i++){
      if(i != nums[i]-1){
        //数字是位置+1
        arr.push(i+1);
      }
   }

   return arr;

};

原文地址:https://www.cnblogs.com/weizhibin1996/p/9775663.html

时间: 2024-07-30 13:12:08

LeetCode448-找到所有数组中消失的数字(原地数组)的相关文章

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

找到所有数组中消失的数字 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] 时间复杂度为O(n),空间复杂度为O(1)的做法.(符合题目要求的做法,没有使用多余空间).遍历数组,

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

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] java版 可以定义一个长为n的数组初始化为0,遍历数组令相应的值变为1,没有变1的则是没有出现过的.但是这种方法需要空间复杂度O

找到所有数组中消失的数字

题目描述 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] 分析 题目要求额外空间且时间复杂度为O(n).按近小到大的顺序排序,如果该数字和对应数字-1所在索引不同,则交换位置,交

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

题目 给定一个范围在? 1 ≤ a[i] ≤ n (?n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-

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

描述 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入:[4,3,2,7,8,2,3,1] 输出:[5,6] 解析 遍历每个元素,将它放在正确的位置上.如果原位置上的元素等于待交换的元素,就i++. 代码 public List<Int

LeetCode 448.找到所有数组中消失的数字 - JavaScript

题目描述:给定一个范围在 ? 1 ≤ a[i] ≤ n (?n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为 O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 题目分析 这一题和Leetcode 442.数组中重复的数据解决思路很相似.但没有完全明确的限制空间使用. 解法 1:哈希表 算法流程如下: 准备一个哈希表 map,结构是number-

算法15-----找到所有数组中消失的数字

1.题目: 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] 2.代码:将该值对应到索引下,索引值变为负数,最后为整数的索引为所求. def findDisappearedNum

1-找出数组中重复的数字

力扣-面试题03. 数组中重复的数字 修改数组 不修改数组 题目描述: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 输入: [2,3,1,0,2,5,3] 输出: 2or3 //把每个数放到对应的位置=>i=nums[i] class Solution { public: int duplicateInArray(vector<int>&

剑指Offer面试题51(Java版):数组中重复的数字

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数.请找出数组中任意一个重复的数字. 例如如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 解决这个问题的一个简单的方法是先把输入的数组排序.从排序的数组中找出重复的数字是件容易的事情,只需要从头到尾扫描排序后的数组就可以了.排序一个长度为n的数组需要时间为O(nlogn)时间. 还可以利用哈希表来解决这个问题,从头到尾