【剑指Offer】【查找&排序】11_旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
我原本看不太懂题目,直到看了一下题解,说是数组包含两个递增排序的子序列
大概的意思就是说,数组是递增的,但是第一个不是最小的。
例如{1,2,3,4,5}
它的旋转数组可以是:{5,1,2,3,4} {4,5,1,2,3} {3,4,5,1,2}
也有特例:例如{0,1,1,1,1}它的旋转数组有{1,0,1,1,1} {1,1,0,1,1} {1,1,1,0,1}
A:使start指向数组头,end指向数组尾,mid指向数组中间
若mid 大于等于 start,则mid还在第一个递增序列中,将start置为mid
若mid 小于等于 end,则mid在第二个递增序列中,将end置为mid
若为特例,则start == end == mid此时只能用顺序查找的方法
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty())
{
return 0;
}
int start = 0;
int end = rotateArray.size() - 1;
int mid = 0;
while(rotateArray[start] >= rotateArray[end])
{
//找中值mid
if(end - start == 1)
{
mid = end;
break;
}
mid = (start + end) / 2;
//若start,end,mid指向数字相同,则顺序查找
if((rotateArray[start] == rotateArray[end]) && (rotateArray[start] == rotateArray[mid]) )
{
int ret = rotateArray[start];
for(int i = start + 1; i <= end; i++)
{
if(ret > rotateArray[i])
{
ret = rotateArray[i];
}
}
return ret;
}
//中值 >= 左值,左值 = 中值
if(rotateArray[mid] >= rotateArray[start])
{
start = mid;
}
//中值 <= 右值,右值 = 中值
else if(rotateArray[mid] <= rotateArray[end])
{
end = mid;
}
}
return rotateArray[mid];
}
};

相关题目:
回文数组
查找第K大的元素

浙公网安备 33010602011771号