码迷,mamicode.com
首页 > 编程语言 > 详细

旋转有序数组的二分查找

时间:2015-10-13 22:31:47      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:

要求

   给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1)。

例子

有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋、右旋效果相同)。

  • 查找元素5,返回结果2;
  • 查找元素8,返回结果-1。

分析

  可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果;利用有序的特点,可以轻易的想到二分查找的方法。经过旋转后的数组总是可以分为两个有序序列,如下图所示。旋转数组分成了红蓝两段有序序列。

                                                             技术分享

  可以看出中间位置m(m‘)的两边必然有一个是有序的,如果是m则左边有序;如果是m‘则右边有序;如下可以看出。

                                                             技术分享

  总结规律:每次根据L和R求出m后,m左边[L, m-1]和右边[m+1, R]这两部分中至少一个是有序的。

       (1)arr[m]=X,返回m

       (2)arr[m]<arr[R],位于m‘位置右侧是有序的;当arr[m‘]<X<arr[R]时,则L=m‘+1,否则R=m‘-1。

       (3)arr[m]>=arr[R],位于m位置左侧是有序的;当arr[L]<X<arr[m]时,则R=m-1,否则L=m+1。

参考代码

 

旋转有序数组的二分查找

标签:

原文地址:http://www.cnblogs.com/cling-cling/p/4875961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!