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

前几天看到一个百度的面试题,是这样的:

有一个一定长度的数组,其中的数据是无序排列的。现在知道的是,其中某个数据的个数,一定是大于数组长度的一半的。现在问的是:如何在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中的数据便是要求的值。

示例程序如下ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值