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

来源:互联网 发布:网络应急演练原则 编辑:程序博客网 时间:2024/05/29 15:12

一个数组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]);}}


0 0
原创粉丝点击