問題:数字を繰り返し配列を見つけます。
配列の長さ、配列:入力
出力:重複した数字のために、存在する場合、最初のデジタル出力の繰り返しです。
アイデア:あなたは配列をソートする場合は、Oの時間複雑(nlogn)のを必要としています。数字0〜N-1は、それぞれの番号を繰り返し数は、より効率的なアルゴリズムの使用は、デジタル位置の複数発生した場合、位置にあるべきです。
- まず、アレイ全体を通して、それは番号iの添字NUMに等しいか否かが判定されます、
- それらが等しい場合には、次の桁に横断します。
- 等しくない場合は、番号が添え字NUMと比較されます。
それらが等しい場合は、最初の繰り返しの数字を見つけました
等しくない場合は、2つのデジタル交換機は、インデックスiが数NUM」に等しいかどうかを決定していき
- 最後に、完全な配列トラバーサル場合、どの2つの同じ番号が表示されず、その後、数字のない重複が存在しないと結論付けます。
コード:
#include <iostream>
using namespace std;
bool duplicate(int numbers[], int length, int* duplication)
{
if(numbers==nullptr || length<=0)
{
return false;
}
for(int i = 0;i< length; ++i)
{
if(numbers[i]<0 || numbers[i]>length-1)
return false;
}
for(int i=0;i<length; ++i)
{
while(numbers[i]!=i) {
if(numbers[i]==numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
int temp= numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
int main()
{
int numbers[]={1,0,2,4,2};
int duplication;
if(duplicate(numbers, 5, &duplication))
{
cout<<duplication<<endl;
}
else
{
cout<<"false"<<endl;
}
// cin.get();
return 0;
}
複雑性分析:O(n)との時間複雑さは、新しいスペースを開く必要はありませんので、スペースの複雑さはO(1)があります。