【算法题】 判断长度为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   新西兰程序员  阅读(120)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示