zoukankan      html  css  js  c++  java
  • 算法(2) Find All Numbers Disappeared in an Array

    题目:整数数组满足1<=a[i]<=n(n是数组的长度),某些元素出现一次,某些元素出现两次,在数组a[i]中找到【1,n】区间中未出现的数字。比如输入【4,3,2,7,8,2,3,1】,输出【5,6】。时间复杂度要求是O(n),空间复杂度要求O(1)

    思路:看许多网友说用set数据结构去做,这就违反了空间复杂度的要求,所以排序还是要本地做的。遍历数组,把这个数字放到它该待的地方:比如a[0]=4,那么我们就把4放到a[3]处,然后把a[3]处的7放到a[6]处,把a[6]处3放在a[2]处,把a[2]处的2放在a[1]处,晕了吧

    这样做:

    step1: ,3,2,,8,2,3,1

    step2:,3,2,4,8,2,,1

    step3:,3,,4,8,2,7,1

    step4:,3,4,8,2,7,1 

    step4.1:此时想着交换3和3,但是发现重了,那么3还是待在原位吧,我们就进一步考察a[1]这个位置发现a[1]=2,2就是应该待在这里,不需要调整;接着查看a[2]位置,a[2]=3, 不需要调整;a[3]=4,不需要调整;a[4]=8,需要调整,去看8应该呆的a[7]位置=1需要交换:

    step5:3,2,3,4,,2,7,

    step6:,2,3,4,,2,7,8

    step6.1:此时想着交换3和a[2]位置的3,但是a[2]=3=3,所以这里也就不做置换咯,直接考察下一个位置a[5]=2;

    step6.2:想着交换2和a[1]位置的2,但是a[1] = 2 = 2,所以不需要交换咯;

    step6.3:接着下一个位置,a[6] = 7,是7该待的地儿,接着下一个位置;a[8] = 7,也是8该待的地儿;

    遍历一圈的数组是:12343278

    然后再遍历一圈,找到a[i] != i+1的数组项,就能找到缺省的指i+1咯

    答案

    https://github.com/honpey/codebox/blob/master/leetcode/array/p448.cpp

    相关

    1<= a[i] <= n; 1至n的数字缺少一个,找出缺少的数字;

    总结

    特殊的数组可能会出现O(n)的排序方法

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/honpey/p/6751940.html
Copyright © 2011-2022 走看看