33. 搜索旋转排序数组

题目

解决旋转数组的题,我们需要认识到两个规律:
(1)把数组划分为左右两边任意长度的两个数组,其中某个数组肯定为排序数组,而另一个仍然是旋转排列数组。
(2)排序数据最后一个元素大于第一个元素,旋转数组最后一个元素小于第一个元素。

这个规律怎么证明呢?
(1)把旋转排列数组首尾相接,形成一个圈如下图所示。


旋转数组生成圈

(2)容易知道,我们可以在圈中任意一个位置,把这个圈用红线分划开,就形成了一个旋转排序数组。
(3)再用蓝线把圈分成两个半弧,就是把一个旋转数组划分成了左右两个子数组。
(4)综上可知,我们在圈了任意两个位置,放置红线和蓝线,其实就能得到任意旋转数组在任意位置划分出的左右两个子数组。
(5)旋转数组有两个异常点,即图中6->0这两个点,分情况讨论下这两个点。
  1) 如果这个两个异常点被划分到同一个半弧中,如下图所示,则不包含这两个点的另一半弧就是排序数组。
  1) 如果这个两个异常点被分别划分到两个半弧中,则两个半弧都是排序数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容