题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
解题思路:
- 开始想的是由于vector数组通过下标访问元素特性,第一想法是找最小值,直接进行遍历数组;将从头开始第一个元素number[0]赋值给min变量,每个元素与之对比,遍历完之后,即可得到最小值;但是想想这个题目给你的是旋转的数组,意义何在?我没有利用这个特性减小算法复杂度。
- 由于是旋转的数组(头元素挨个搬到尾部),并且搬运前都是升序数组,那么就可以知旋转后的元素,从尾部开始向前进行遍历时,是降序排列。
- 这样一直从尾部向前找下去,出现第一个元素大与后一个元素时,那么这个后一个元素就是最小值,这样能减少遍历次数。
- 旋转的越少元素,遍历的就越少。
注意:
- 当数组元素个数为1个时,则直接返回该元素;
- 所以在for循环体中,数组元素个数最少是2个;
class Solution {
public:
int minArray(vector<int>& numbers)
{
int len=numbers.size();
int min=numbers[len-1];
if (len==1)
return min;
for (int i=len-2; i>=0; --i)
{
//min=min < numbers[i] ? min:numbers[i];
if (min < numbers[i])
{
return min;
}
min=numbers[i];
}
return min;
}
};