算法练习:检测一个int(整型)数组中是否存在相同的数(只用基本数据结构)
2013-07-10 17:38
603 查看
package codinginterview; public class CheckArray { /** * 时间复杂度是O(n2 ) * @param a * @return */ public static boolean hasDuplicate(int[] a) { for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length; j++) { if (a[i] == a[j] && i != j) { return true; } } } return false; } /** * 时间复杂度为O(n). * 考虑到数组中有可能出现最大整型数,比如(1<<31)-1; * 位运算时,可申请max(a[i])/32+1个整型数来表征映射位; * 但是找出数组中的最大值max(a[i])也会产生计算量; * 相比上面方法一O(n2)来说,这里的时间复杂度是O(n),还是值得的; * 如果对内存不敏感的话,你可以直接申请(1<<32)/32=(1<<27)个大小的int数组 * @param a * @return */ public static boolean hasDuplicate2(int[] a) { //int len=1<<27; int max=findArrayMaxInt(a); int len=max/32+1; int [] b =new int[len]; for (int i = 0; i < a.length; i++) { int idx=a[i]/32; int shift=a[i]% 32; int check=b[idx]&(1<<shift); if(check!=0)return true; b[idx]|=(1<<shift); } return false; } /** * 时间复杂度为O(n). * 这种方法与方法二原理一样,只不过把用int型映射的存储位换成boolean型数组来表征 * 缺点:内存空间使用量大,而且遇到数组中有最大整数(1<<31)-1值(或这个量级的)时, * 初始化boolean数组,内存空间会溢出 * @param a * @return */ public static boolean hasDuplicate3(int[] a) { int max=findArrayMaxInt(a); int len=max+1; boolean[] b = new boolean[len]; for (int i = 0; i < a.length; i++) { if (b[a[i]])return true; b[a[i]] = true; } return false; } private static int findArrayMaxInt(int[] a) { int max = a[0]; for (int i = 1; i < a.length; i++) { if (max < a[i]) max = a[i]; } return max; } public static void main(String[] args){ int [] a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,22,32,33,34,35,36, 48,53,56,60,64,66,103,104,127,128,129,132,200,256,512,2342, 1<<16,1<<15,1<<14,1<<13,1<<12,1<<11,1<<10,(1<<31)-1,(1<<31)-2}; System.out.println("a["+(a.length-1)+"]="+a[a.length-1]); System.out.println(hasDuplicate(a)); System.out.println(hasDuplicate2(a)); //System.out.println(hasDuplicate3(a));//这里该数组不适合用方法三,数组中的(1<<31)-1,(1<<31)-2会在boolean数组初始化时内存溢出 //测试数组为[0,(1<<16)-1]连续区间的用例 int len=(1<<20)-1; int [] all=new int[len]; for(int i=0;i<len;i++){ all[i]=i; } System.out.println("all["+(all.length-1)+"]="+all[all.length-1]); //System.out.println(hasDuplicate(all));//数组中元素特别多的时候,O(n2)级的算法效率就是问题 System.out.println(hasDuplicate2(all)); System.out.println(hasDuplicate3(all)); } }
相关文章推荐
- 算法练习:判断一个字符串中的字符是否唯一(只用基本数据结构)
- 给出一个有效的算法来确定在整数A1<A2<A3<...<AN的数组中是否存在整数i使得Ai=i
- 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。
- 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
- 判断一个int数组中的元素是否存在重复
- 判断一个int数组中的元素是否存在重复
- 请教一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同
- 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。
- 判断一个字符串中的字符是否唯一(只用基本数据结构)
- 算法练习:字符串原地逆序(in-place reverse)(只用基本数据结构)
- Java总哈希表的运用,判断一个数组中是否存在相同的元素之间的距离在k以内!
- 判断一个字符串中的字符是否唯一(只用基本数据结构)
- 微软等数据结构+算法面试100题(9)--在一个int 数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- 给你一个整型数组如{1,3,4,7,2,1,1,5,2}, * 打印出现次数最多的那个数,如果最多的次数相同,则打印数字大的那个数。
- A B两个相同长度整数数组,判断相同下标对应值是否相等,true或者false 存在布尔数组C中
- 程序员面试金典: 9.4树与图 4.2给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
- 整型数组处理算法(十二)请实现一个函数:最长顺子。[风林火山]
- js使用数组判断提交数据是否存在相同数据