【百度面试题】循环有序数组的查找问题

来源:互联网 发布:php cms 编辑:程序博客网 时间:2024/04/29 22:49

问题:

有一个循环有序数组A,如{7,8,9,0,1,2,3,4,5,6},不知道其最小值的位置。

那么如何从这样的数组中寻找一个特定的元素呢?

 

解决:

当然,遍历总是一个办法。当然面试的时候回答遍历估计就直接杯具了。

 

我的想法是将原数组分段,用首元素s,中间元素m和尾元素e,可以将数组分为两个子数组s1,s2,

那么,必然有至少一个子数组是有序的。那么如何确定那一段是有序的呢?

通过分析可以看到只有3种情况:

●当s就是A中最小的元素时,以下不等式成立:

  s <= m <= e

 

●当最小值位于(s, m]时,则有:

  m <= e <= s

 

●当最小值出现在(m,e]时,则有:

  e <= s <= m

 

所以通过s,m,e的大小关系,可以很轻松的判断出s1和s2哪个是有序的。

通过比较要查找的目标t 与s,m,e的大小关系,可以知道t位于哪个子数组。

若t位于有序的子数组,则用二分查找就可以了。

否则,对无序的子数组重复刚才的过程就可以了。

具体代码如下:

 

 

 

原创粉丝点击