【算法题】 判断长度为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; }

 

posted on 2023-02-07 16:18  新西兰程序员  阅读(107)  评论(0编辑  收藏  举报