题目:
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
示例:
输入:[3,4,5,1,2]
返回值:1
思路: 采用二分法进行查找,
- 首先如果first指针所指向的数大于mid指针所指向的数,则说明mid在第二个递增序列中,最小目标值在前半截需要将mid赋值给last
- 如果first指针所指向的数小于mid指针所指向的数,则说明mid在第一个递增序列,最小目标值在后半截需要将mid赋值给first
- 如果first和last指向相等,则说明找到最小目标值
- 有一个特殊情况,例如:[1,1,1,0,1],first和last相等则退化成顺序遍历
function minNumberInRotateArray(rotateArray)
{
// write code here
var first = 0;
var last = rotateArray.length-1;
var mid=first;
while(rotateArray[first] >= rotateArray[last]){
mid = Math.floor((last+first)/2);
// mid = first + ((last-first)>>1);
if(last-first==1 ){
return rotateArray[last];
}
// 中间数在第一个递增数列中,因此最小目标值在后半截
if(rotateArray[first]<rotateArray[mid]){
first=mid;
}
//中间数在第二个递增数列中,因此最小目标值在前半截
else if(rotateArray[first]>rotateArray[mid]){
last=mid;
}
//如果第一个数和最后一个数相等,则会退化成顺序遍历
//特例:[1,1,1,0,1]
if(rotateArray[first]==rotateArray[last]){
var min = rotateArray[0];
for(let i=0;i<rotateArray.length;i++){
if(min>rotateArray[i]){
min =rotateArray[i];
}
}
return min;
}
}
return rotateArray[mid];
}