剑指offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个 非减排序 的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:首先理解数组的旋转定义,可以发现旋转数组可以划分为两个非减排序的子数组,而最小元素在两个子数组的分界处。 (1)我们用两个指针分别指向数组的第一个元素和最后一个元素,根据旋转数组定义,我们知道第一个元素应该是大于等于最后一个元素的。 (2)找到数组的中间元素; 如果中间元素位于前面的递增子数组,那么它应该大于等于第一个指针指向的元素,此时最小元素应该在中间元素的后面。我们把第一个指针指向中间元素。 如果中间元素位于后面的递增子数组,那么它应该小于等于第二个指针指向的元素,此时最小元素应该在中间元素的前面,我们把第二个指针指向中间元素。 可知,第一个指针始终指向前面递增子数组的元素,第二个指针总是指向后面递增子数组的元素。它们最终会相邻,而第二个指针会指向最小元素。这就是循环结束的条件。 除此,我们还需要考虑一些特殊情况: 1、数组未旋转,即旋转后的数组和原数组一致,那么第一个元素是最小元素。 2、考虑有重复元素的情况:{1, 0, 1 , 1, 1}, {1, 1, 1 , 0,