判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
2011-03-05 17:48
916 查看
判断数组中是否有重复整数的方法: #include "stdio.h" #define MAX 200//就是允许整数数组中的最大数组 #define Len 10 //有一个整型数组,判断里面是否有重复数据,要求O(n)的算法 int main() { int arr[Len] = {123,10,3,5,199,77,99,8,5,10}; int flag[MAX] = {0}; for (int i=0;i<Len;i++) { if (flag[arr[i]] == 1) { printf("有重复数字/n"); break; } else flag[arr[i]] =1; } return 0; } 1.缺点:MAX比较大时就不合适了,比如如果数组中有一个整数是326489,那么必须至少宏定义MAX的值为为326489+1 摘要别人的思路如下: 假如是下面的方法判断是否有重复 int a[MAX] = {0}; unsigned int x; for(int i=0;i <n;i++) { //读入x if(a[x]==1) { //x重复出现了 } else { a[x]=1; } } 那么,MAX比较大时就不合适了 但是可以把“用int数组记录是否重复”改为“用每一个bit记录是否重复”,于是变成: int a[MAX] = {0}; unsigned int x; const int iBitCount = 32; for(int i=0;i <n;i++) { //读入x if(a[x/iBitCount]& (1 < <(x%iBitCount))!=0) { //x重复出现了 } else { a[x/iBitCount] ¦= (1 < <(x%iBitCount)); } } |
相关文章推荐
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- (六)一个判断整形数组中是否有重复数字的简单算法
- 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 判断一个整数中是否有重复数字(0~9),该数字不以0开头--------方法1
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所 有偶数位于数组的后半部分。要求时间复杂度为O(n)。
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 算法-在1001个整数中找出一个重复出现的数字
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
- 求解一个数组里等于给定整数和的两个数的O(n)时间复杂度算法
- 2. 有一个二维数组.----杨氏矩阵 。数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);