オファーの表面安全質問の配列番号の重複を証明3_1

問題:数字を繰り返し配列を見つけます。

配列の長さ、配列:入力

出力:重複した数字のために、存在する場合、最初のデジタル出力の繰り返しです。

アイデア:あなたは配列をソートする場合は、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)があります。

公開された56元の記事 ウォン称賛10 ビュー6809

おすすめ

転載: blog.csdn.net/qq_22148493/article/details/104211003