入力:A = {7, 3, 4, 1}
、m = 5
出力
:x = 6
私はCでの解決策を探していますが、擬似コードのいずれかの種類が役立つだろう...この問題はOで解決することができる(N)ここで、nは設定されたサイズですか?
入力:A = {7, 3, 4, 1}
、m = 5
出力
:x = 6
私はCでの解決策を探していますが、擬似コードのいずれかの種類が役立つだろう...この問題はOで解決することができる(N)ここで、nは設定されたサイズですか?
私はそれを使って余分な配列を解決しました。ここで 'len'は配列の長さです。
int findMin(int *arr,int n,int len)
{
int *hash;
if(len==0)
{return -1; //fail
}
hash=(int*)calloc(len,sizeof(int)); //hash function I'm using is f(x)=f(x)-n;
int i;
for(i=0;i<len;i++){
if(arr[i]>n && arr[i]<len+n){ //because max element can't be more than n
hash[arr[i]-n]++;
}
}
i=1;
while(i<len){
if(hash[i]==0)
return len+i;
i++;
}
return len+n+1;
}
このソートの順番は、実行時間がO(n)、O(n)である。
次のJavaコードは、あなたのために働く必要があります。
public static int findMinNotInArray(int array[], int n) {
int frequency[] = new int[array.length];
if (n < max(array)) {
for (int i = 0; i < array.length; i++) {
if (array[i] > n && array[i] < n + array.length)
frequency[array[i] - (n + 1)]++;
}
for (int i = 0; i < frequency.length; i++) {
if (frequency[i] == 0)
return i + n + 1;
}
return -1;
} else {
return n + 1;
}
}
public static int max(int array[]) {
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
上記のコードは、単に(n+1) + lengthOfA
にn+1
から番号を追跡し、この範囲からいずれかの配列に存在するか否か!そして、最初に存在しない数字を返します!
Nope; OPのテストケースでは、これは '6'の代わりに' -1'を返します。 – michaelb958
私は答えを編集してレビューしてください! –
私は考えていますが、最も実現可能なアプローチは配列を最初にソートすることです。次に、m
のバイナリ検索を実行して、隣接するものが複数離れている次のポイントを線形検索します。
このアプローチの複雑さはソートアルゴリズムの複雑さです。ほとんどの場合、O(nlogn)です。
なぜそれを最初にソートしますか?あなたは配列上で一回だけ反復することができます。(if(a [i]
明らかなギャップがあることを考慮する必要があります。ギャップは後で埋められます。このように:{0,2,3,4,1}、m = 0。この場合は5を返す必要があります.O(n * n)を意味するので、1,2,3,4を順番に試してみる必要はありません。つまり、なぜ私が最初にソートするのか。 – cmaster
@AntonRoth:配列に*ではない*値を見つける必要があります。あなたのアプローチは配列にある値を見つけるために働くでしょう。 – interjay
'calloc(0、len);'は少し小さいようです。 – wildplasser
@wildplasser指摘していただきありがとうございます。私は答えを更新しました – banarun
'nmembまたはsizeが0の場合、calloc()はNULLか、後でfree()に渡される一意のポインタ値を返します。 – wildplasser