如何判断一个整数数组中是否有重复元素
来源:互联网 发布:邮政网络培训学院 编辑:程序博客网 时间:2024/05/11 23:31
题目:
写一个函数判断一个int类型的数组是否是有效的。
所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组。
例如[5,3,1,4,2,0]是有效的,[5,3,5,1,2,0]是无效的,[5,3,6,1,2,0]是无效的。
解法思路一:置换的思想
用一个temp来存储被置换出来的值,例如数组a:
5 3 1 4 2 0
首先,初始化时取第一个数5,将5放在数组的第5号位置,将原来的位置改为-1,5号被置换出来的值放在 temp。即,
-1 3 1 4 2 5 temp=0
下一步,将temp中的值放在a[temp]中:
0 3 1 4 2 5
接着,置换3:
0 -1 1 3 2 5 temp=4
0 -1 1 3 4 5 temp=2
0 -1 2 3 4 5 temp=1
0 1 2 3 4 5
排序成功,然后直接遍历一遍,后面的元素前前面的元素,值为0,则有重复。
优点:
只申请了一个元素的空间
缺点:
1. 结束条件比较复杂;
(1)用一个Index进行初始化temp操作,
置换过程中,如果temp置换的是-1,则取出index所指的元素赋给temp,并index++;
如果temp置换的不是-1,则取出temp要置换的内容赋给temp;
(2)可以用一个count进行计数,最多置换N次,作为结束条件。
2. 对使用条件比较苛刻,数组必须是存储的刚好[0, n-1]
解决思路二:置反的思想
不用移动的方法
5 3 1 4 2 0
==》0) 5 3 1 4 2 -0 i=0; 取出j=|a[i]|=5; 令a[j]=-a[5]=-0
1) 5 3 1 -4 2 0 i=1; 取出j=|a[i]|=3; 令a[j]=-a[3]=-4
2) 5 -3 1 -4 2 0 i=2; j=|a[i]|=1; 令a[1]=-a[1]=-3
3) 5 -3 1 -4 -2 0 i=3; j=|a[i]|=4; 令a[4]=-a[4]=-2
4) 5 -3 -1 -4 -2 0 i=4; j=|a[i]|=2; 令a[2]=-a[2]=-1
5) -5 -3 -1 -4 -2 0 i=5; j=|a[5]|=0; 令a[0]=-a[0]=-5
所有数为非正整数,且0只有一个,成功。同时执行一遍循环把负数弄回去,复杂度0(2N)
在遍历的过程中,如果发现要取反的值为负的,说明数组中曾经存在过一个i值,使a[i]变为负数,则可知道有重复
优点:
1. 不需要申请空间;
缺点:
使用条件苛刻:连续[0, n-1]的值
解决思路三:数组map的思想
要求空间复杂度为O(1),那么可以申请常数大小的空间,由于int最大表示范围为65536,我们可以直接申请65536大小的数组b。
将原数组中的a[i],通过b[a[i]]++,来进行计数,如果值超过1,则表明有重复。
缺点:
申请空间比较大
优点:
使用条件宽松,可以用于连续整数,也可以用于非连续整数的排序。
该思想很重要,需要掌握!!!
- 如何判断一个整数数组中是否有重复元素
- 如何判断一个整数数组中是否有重复元素
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 判断一个数组中是否有重复的元素
- JavaScript 判断两个数组是否相等 或者 判断一个数组中是否有重复的元素
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 217. Contains Duplicate (判断数组中是否有重复元素)
- js判断一个数组中是否有重复的值
- Javascript判断一个数组中是否有重复值
- 判断一个数组中的元素是否重复?
- 如何判断数组是否存在重复元素
- 对于一个SIZE大小的数组,元素是[0,SIZE-1]区间内的整数,判断其中是否有重复元素
- 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
- C++ - 一个非递减数组,下标从0到n,元素的取值范围为从0到n的整数,判断其中是否有重复元素
- 一个数组下标从0到n,元素为从0到n的整数,判断其中是否有重复元素。
- js 判断数组中元素是否重复
- 【分享】iOS下view hierarchy工具
- Windows Phone开发之应用商店
- ubuntu下面找不到设备的绝招
- Sierpinski三角形
- 谈谈malloc()和free()
- 如何判断一个整数数组中是否有重复元素
- Error while building project
- systemparametersinfo详细
- Android Studio使用教程
- 异常机制和sstream类的运用
- codeforces 204 Jeff and Rounding
- 随记
- 写在最前面
- SQL2000个人版成功连接ADO MFC