您的位置:首页 > 其它

算法--有关于数组查找—1

2013-11-25 10:42 176 查看
前几天看到一个百度的面试题,是这样的:

有一个一定长度的数组,其中的数据是无序排列的。现在知道的是,其中某个数据的个数,一定是大于数组长度的一半的。现在问的是:如何在O(1)的空间和O(n)的时间内,将这个数据找出来。

刚开始做某些算法题,可能会感觉有些没有头绪。但是这个需要多练习。

首先,O(n)的时间,就告诉我们是需要最多遍历一遍。而O(1)的空间,也就说明有少量的中间变量的存储空间。因此,我们就需要在遍历这个数组的同时,用这几个仅有的空间进行中间变量的存储。当便利到一定数量或者数组的最后时,在中间变量中就会直接或者间接得到做最终结果。

因此可以看到,题目的最主要的关键之处就在于如何来处理中间变量。

解答:

将数组表示为A。用两个中间变量a,b。a中初始化为A[0]。b初始化为1,表示a中存储的数据的个数。然后遍历到A[1],如果a==A[1],则a不变,b++;如果a!=A[1],则有两种情况:1,如果b==1,则a=A[1],b仍是1;2,如果b!=1,则b--,a不变。这样,直到最后的那个a中的数据便是要求的值。

示例程序如下:
/**
* @author Administrator
* 有一个一定长度的数组,其中的数据是无序排列的。现在知道的是,其中某个数据的个数,一定是大于数组长度的一半的。
* 现在问的是:如何在O(1)的空间和O(n)的时间内,将这个数据找出来。
*/
public class Test1 {

public static void main(String[] args) {
int[] A={3,4,5,5,3,5,5,6,5,5,1};
int a=A[0];
int b=1;
for(int i=1;i<A.length;i++){
if(a==A[i]){
b++;
}
else{
if(b==1){
a=A[i];
}
else{
b--;
}
}
}
System.out.println(a);
}

}


如发现有问题,欢迎批评指正,一块交流学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐