您的位置:首页 > 理论基础 > 数据结构算法

算法练习:检测一个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));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐