面试题 11:旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 {3, 4, 5, 1, 2} 为 {1, 2, 3, 4, 5} 的一个旋转,该数组的最小值为 1。

  • 查找较为简单,不外乎顺序查找、二分查找、哈希表查找、二叉排序树查找。
  • 遇到排序的数组(或者部分排序的数组),可以尝试用二分查找算法。
  • 哈希表和二叉排序树查找的重点在于考查对应的数据结构,而不是算法:
    • 哈希表最主要的优点是能够在 O(1) 时间内查找某一元素(效率最高),缺点是需要额外的空间;
    • 二叉排序树对应的数据结构是二叉搜索树。
  • 排序复杂一些,要求比较插入排序、冒泡排序、归并排序、快速排序等不同算法的优劣。
  • 要求应聘者写出快速排序的代码:Partition 函数 + 递归。

应聘者一定要问清楚排序应用的环境是什么、有哪些约束条件。
无论移动第一个指针还是第二个指针,查找范围都会缩小到原来的一半。
最终,会指向两个相邻的元素,第二个指针指向的刚好是最小的元素。

排序数组本身是数组旋转的一个特例;要考虑到数组中有相同数字的特例。

Source Code