【算法题】 判断长度为N的数组中是否有重复数据
有一个算法题是这样的,有一个长度为n的整形数组, 这个数组中每个元素的取值范围都是[0,n-1], 我们要判断这个数组中是否有重复的数,如果有,找出这个数组中任意一个重复的数字
比如 数组 {2,3,1,0,3,7,2} => 对应输出的数字应该是2或者3 , 你找到其中一个就可以
这个算法题的解题思路是这样的:
由于这个长度为n的数组中,每个元素的取值范围在0到n-1之间,所以我们可以把每个元素放在它的值对应的序号位置上, 如果此时发现其他位置上有和自己相同的数,那么就是重复的数
时间复杂度为O(N), 为了节省空间复杂度,可以在原数组上进行操作,所以空间复杂度为O(1)
比如 数组 A = {2,,3,1,0,3,7,2}
第一个元素值是2,我们就把它放在A[2]上,也就是数组的第三个位置 (也就是说要把第三个位置的元素和第一个位置元素互换,如果此时发现它们相等,那么就是一个重复数)
第二个元素值是3, 我们就把它放在A[3]上,也就是数组的第四个位置 (也就是说要把第四个位置的元素和第二个位置元素互换,如果此时发现它们相等,那么就是一个重复数)
第三个元素值是1, 我们就把它放在A[1]上,也就是数组的第二个位置 (也就是说要把第二个位置的元素和第三个位置元素互换,如果此时发现它们相等,那么就是一个重复数)
第四个元素值是0,我们就把它放在A[0]上,也就是数组的第一个位置 ........依此类推
代码如下
bool IsDuplicateExist(int[n] testArr, int n) { if(testArr == NULL || testArr.Length == 0)
return false;
for(int i = 0; i < n; i++)
{
int temp;
while(testArr[i] != i)
{
if(testArr[testArr[i]] == testArr[i])
return true;
temp = testArr[testArr[i]];
testArr[testArr[i]] = testArr[i];
testArr[i] = temp;
}
}
return false; }