生成剩余数字列表

时间:2014-04-26 19:46:27

标签: arrays algorithm

给定数n,以及大小为m的数组,其中m

我就是这样做的(伪代码),但感觉效率很低,我想知道是否有更好的方法:

int[] remaining (int[] assigned) {
    Set<int> s
    int[n-m] remaining
    add each int in assigned to s
    for(i = 0 to n-1) 
        if(not s.contains(i)) remaining.add(i);
}

这不是任何特定的计算机语言,但它应该是ilustrative。我们假设访问数组当然是O(1),并且添加/检查集合是O(log(n)),因为AVL集合将是。所以基本上我试图在线性时间内得到它,而不是现在的O(n·logn),但是如果初始数组没有排序我不知道如何去做,或者甚至可能

4 个答案:

答案 0 :(得分:3)

将数组复制到散列映射H。这需要O(m)

for i from 0 to n-1
    if(H.ispresent(i) == FALSE)
        output i

此for循环需要O(n)。 由于n>=m,整体复杂度为O(n)

答案 1 :(得分:2)

bitset(位数组)的想法:

#include <iostream>
#include <fstream>
#include <bitset>

const int SIZE = 10;  // for example

int main() {
    std::bitset<SIZE> bs;
    int i;

    std::ifstream fin("numbers.txt");
    while (fin >> i)
        bs.set(i);
    fin.close();

    for (i = 0; i < SIZE; ++i)
        if (!bs[i])
            std::cout << i << '\n';

    return 0;
}

答案 2 :(得分:2)

我认为会快一点 伪代码也

int[] remaining (int[] assigned) {
    Set<int> s
    int[n] all
    int[n-m] remaining
    for(i = 0 to m-1) 
        all[assigned[i]]=-1
    int counter=0
    for(i = 0 to n-1) 
        if (all[i]==-1)
            remaining[counter]=all[i]
            counter++
    return remaining
}

答案 3 :(得分:1)

如果您必须找到1或2个缺失的数字,您可以随时使用数字的总和和/或乘积来计算缺失的数字。如果它超过2

在java中使用Bitset查找缺失数字的代码。

public List<Integer> findMissingNumbers(List<Integer> input,int maxNum){

/ *你也可以通过列表进行交互,然后找到maNum。 bitset基于向量并且可以增加大小     * /     if(input == null || input.size()== 0)       return null;

BitSet existSet=new BitSet(maxNum);
for(int val:input){
    existSet.set(val);
}

List<Integer> missingNum=new ArrayList<Integer>();
for(int i=0;i<existSet.length()){
     nextIndex=bitSet.nextClearBit();
     if(nextIndex==-1)
       break;
     missingNum.add(nextIndex);
     index=nextIndex+1;

}
return missingNum;

}