解决旋转数组的题,我们需要认识到两个规律:
(1)把数组划分为左右两边任意长度的两个数组,其中某个数组肯定为排序数组,而另一个仍然是旋转排列数组。
(2)排序数据最后一个元素大于第一个元素,旋转数组最后一个元素小于第一个元素。
这个规律怎么证明呢?
(1)把旋转排列数组首尾相接,形成一个圈如下图所示。
(2)容易知道,我们可以在圈中任意一个位置,把这个圈用红线分划开,就形成了一个旋转排序数组。
(3)再用蓝线把圈分成两个半弧,就是把一个旋转数组划分成了左右两个子数组。
(4)综上可知,我们在圈了任意两个位置,放置红线和蓝线,其实就能得到任意旋转数组在任意位置划分出的左右两个子数组。
(5)旋转数组有两个异常点,即图中6->0这两个点,分情况讨论下这两个点。
1) 如果这个两个异常点被划分到同一个半弧中,如下图所示,则不包含这两个点的另一半弧就是排序数组。
1) 如果这个两个异常点被分别划分到两个半弧中,则两个半弧都是排序数组。