この質問で何が欠けているのかわかりませんが、私の知る限り、(合理的な)解決策がO(n)
時間(および空間)の複雑さよりも/悪いものでなければならない理由がわかりません。
上記のコメントと回答から、次のことを理解しています。
- 負の数 : 負の数が許可されているかどうかはわかりません。OPは言う
check if all the array has all the numbers from 0 to X-1
。したがって、配列内でそれ以下のもの0
は想定されていません。したがって、負の数は許可されていないと思います
- 重複した数字 : OP からの同じ引用を参照 -が配列のサイズであり、 から までのすべての数字が存在する必要がある場合、重複した数字は許可されていないと思います
check if all the array has all the numbers from 0 to X-1
。X
0
X-1
したがって、上記の仮定を行うと、1 ビットを使用してi
( 0 <= i <= X-1
) が存在するかどうかを確認できます。が重複している場合i
、重複した番号があることを言及するのに失敗します。
配列全体を1回スキャンし、O(n)
要素ごとに1ビットを使用するだけなので、ビットX
が必要です-たとえば、要素を処理する必要があり、配列要素を保持するためにメモリが必要であり、配列要素を格納するためにのみ使用される要素の存在。10
X
1000000
sizeof(int)
4
3.82M
0.48M
#include <stdio.h>
#define X 10
#define MIN 0
#define MAX X-1
int main(void)
{
//int arr[X] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
//int arr[X] = {6, 7, 8, 9, 0, 5, 3, 2, 11, 12};
//int arr[X] = {1, 1, 2, 4, 5, 6, 7, 8, 2, 2};
int arr[X] = {1, 3, 2, 4, 5, 6, -7, 8, 2, 2};
/* if X is more than sizeof(int) then change
the flag type to a wider one! */
int flag = 0;
int i;
for(i=0 ;i<X ; i++) {
if (arr[i] >= MIN && arr[i] <= MAX) {
if (flag & 1<<arr[i]) {
printf("Duplicate found : %d \n", arr[i]);
return -1;
}
flag |= 1<<arr[i];
} else {
printf("Failure at %d : %d \n", i, arr[i]);
return -1;
}
}
printf("Success \n");
return 0;
}