人々は震え質問に直面しています
。
。
。
当社は、対象者に見て
、すべての数字が0〜N-の範囲内にある長さnの配列に。一部のデジタル配列が重複しているが、各番号は見つけることが何回繰り返すか分からない、いくつかの重複したデジタル倫理があるかわからない任意の繰り返し桁
注:O(n)との時間の複雑さを、スペースの複雑さO(1)
ルを解決する方法は???
分析:0〜N-1は、配列の添字と比較される配列の内容を使用することができる範囲のタイトルを使用して
(!編曲[I] =のARR [ARR [I])であれば、 等しくない、交換される場合、等しいです、戻り値は、直接
コードを見て
#include<stdio.h>
#define SIZE(arr) sizeof(arr)/sizeof(arr[0])//数组长度
void Swap(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
int duplicate(int arr[],int len)
{
int i;
if (len < 0)
{
return 0;
}
for (i = 0; i < len; i++)
{
if (arr[i] < 0 || arr[i]>len - 1)//限定数字大小
{
return 0;
}
while (arr[i] != i)
{
if (arr[i] != i)
{
if (arr[i] != arr[arr[i]])//数组中数字是否等于以数字为下标的数字
{
Swap(&arr[i], &arr[arr[i]]);
}
else
{
return arr[i];
}
}
}
}
return 0;
}
int main()
{
int arr[] = {2,3,1,0,2,5,3};
printf("%d", duplicate(arr, SIZE(arr)));
return 0;
}
要約:指定された範囲の後に配列のデータ、インデックスiの複数使用が解決されます