您的位置:首页 > 其它

一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,是否有重复,并统计出来

2014-05-16 10:52 459 查看
一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,是否有重复。时间复杂度O(N),空间复杂度O(1)

也可以处理:题2:一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字

思路:会更改原数组,利用原数组的下标。把每个数放在自己下标相应的地方,如果该下标对应的地方的值等于下标就不用交换。

#include <iostream>
#include <cassert>
#include <algorithm>
#include <cstdlib>
using namespace std;

void count_num(int *array,int n);
int main()
{
int array[10]={4,3,2,3,4,5,2,8,6,2};
count_num(array,10);

for (int i = 0 ;i < 10;i++)
{
cout<<array[i]<<"  ";
}
cout<<endl;
return 0;
}

void count_num(int *array,int n)//会修改原数组
{
assert(array);

for (int i = 0;i < n;i++)//转化 -- 利用这个可以判断重复的数字
{
while (array[i] != i)
{
if (array[array[i]] != array[i] )
{
swap(array[i],array[array[i]]);
}
else
{
break;
}
}
}

for (int i = 0 ;i < 10;i++)//相同的置为-1
{
if (array[i] == i)//array[i] != i 则表示有重复!!即上面提到的第二题
{
array[i] = -1;
}
}

for(int k = 0; k < n;k++)//统计并置位
{

if (array[k] >= 0)
{
array[array[k]]--;
array[k] = 0;
}

}

for (int j = 0 ;j < n;j++)//转成正数
{
if (array[j] == 0)
{
continue;
}
array[j] = abs(array[j]);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐