给定数n,以及大小为m的数组,其中m 我就是这样做的(伪代码),但感觉效率很低,我想知道是否有更好的方法: 这不是任何特定的计算机语言,但它应该是ilustrative。我们假设访问数组当然是O(1),并且添加/检查集合是O(log(n)),因为AVL集合将是。所以基本上我试图在线性时间内得到它,而不是现在的O(n·logn),但是如果初始数组没有排序我不知道如何去做,或者甚至可能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);
}
答案 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;
}