旋转数列问题是个很经典的二分查找问题,这里将其总结一下:
什么是旋转数列?
首先定义旋转数列:
- 原数组为排序数列
- 一次旋转操作为:将数列首元素插入数列末尾
- 经过n次旋转操作的排序数列数组称为旋转数组,其中数组可能会有重复数
旋转数列的特性:
- 无重复数字情况下:
nums[left] > nums[right]
- 有重复数字情情况下:
nums[left] >= nums[right]
在leetcode中共有如下几题:
- 189:旋转数组——实现旋转数组的操作
- 796:旋转字符串——实现旋转数组的操作,并与目标字符串比对
- 33:搜索旋转数组——没有重复数字,找到最小数(旋转点)索引
- 81:搜索选转数组2——有重复数字,判断目标数是否在数组内,其实就是先找到最小数(旋转点)索引,并在最小数前后两个区间继续二分查找
- 153:寻找旋转排序数组的最小值——没有重复数字,找到最小数(旋转点)索引
- 154:寻找旋转排序数组的最小值2——有重复数字,找到最小数(不一定是旋转点)索引
其中189和796基本是同一题,33和153是同一题,而引入重复数字的154和81则带来了不小