一个数组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],写一个算法判断数组中是否存在重复的数字
思路:会更改原数组,利用原数组的下标。把每个数放在自己下标相应的地方,如果该下标对应的地方的值等于下标就不用交换。
也可以处理:题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]); } }
相关文章推荐
- 一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,求每个数字出现的次数
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 有一个长度是101的数组,存在1~100的数字,有一个是重复的,找出重复出来
- randnumber_mn.c 生成一个数组,包括k个不重复的整数,并且要求这些整数范围为[m,n),生成的结果中不能包含inum中的数字,size表示inum的长度
- 在一个长度为n的数组里的所有数字都在1到n-1的范围内。 有一个数字重复若干次,找出这个数字。
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 输入一个不定长度的数字字符串,将其中的数字提取出来并保存在数组中。
- 已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个?
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- Contains Duplicate II 找出数组中是否有重复元素,长度小于k
- 计数排序——有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- C学习笔记 控制数组的有效长度并统计数组中重复数字。
- (六)一个判断整形数组中是否有重复数字的简单算法