算法--有关于数组查找—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中的数据便是要求的值。
示例程序如下:
如发现有问题,欢迎批评指正,一块交流学习。
有一个一定长度的数组,其中的数据是无序排列的。现在知道的是,其中某个数据的个数,一定是大于数组长度的一半的。现在问的是:如何在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); } }
如发现有问题,欢迎批评指正,一块交流学习。
相关文章推荐
- Java学习之数组1(1.数组的声明;2.元素为引用数据类型的数组;3.关于main方法里的String[] args;4.数组排序;5.数3退1 数组算法,(用数组模拟链表);6数组查找之二分法;7数组的拷贝)
- 算法训练 数组查找及替换
- 从数组中查找出最大最小两数的log(n)算法
- 有关在某个数组中查找一个值的算法(Python实现)
- 【智能查询】:关于智能查找输入的算法实现1
- 算法学习-查找旋转数组的最小值
- 从数组中查找出最大最小两数的log(n)算法
- 设计一个更优算法查找一n个元素数组中的最大值和最小值
- 有序数组的查找(个人感觉美到极致的一个算法)
- JAVA基础day04 数组学习 排序和查找基本算法
- KT学算法(二)——循环有序数组查找指定元素
- 算法学习---基本数据类型的数组二分查找实现
- (算法)旋转有序数组中查找某个数
- 关于如何查找数组中和最大的子数组
- 数组元素几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 算法习题48:一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数。
- Python实现在某个数组中查找一个值的算法示例
- 关于顺序数组求最大差值或最大收益算法
- 个人练习数据结构之--------------关于线性数据的有序数组以及之上的二分法查找、不同排序方法的学习