题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入
[3,4,5,1,2]
返回值
1
解题思路
比如: 7 8 9 1 2 3 4 5 6 这个数组,你会发现,(中间元素)2<6(最右边元素);由此可得最小值位于最左边元素到中间元素这个范围。
比如:4 5 6 7 8 9 1 2 3 这个数组,你会发现,(中间元素)8>3(最右边元素);由此可得最小值位于中间元素到最右边元素这个范围。
最坏情况是顺序的:1 2 3 4 5 6 7 8 9 我们找寻的范围是 “1 2 3 4 5----->1 2 3--->1 2” 然后比较12发现1更小。
借助二分查找,搜索的终止条件是left与right相邻,可以把时间复杂度降为logn。
代码
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length==0){
return 0;
}
let leftindex=0,rightindex=rotateArray.length-1;
let centerindex=parseInt((leftindex+rightindex)/2);
let min;
while(leftindex+1!=rightindex){
if(rotateArray[centerindex]<rotateArray[rightindex]){
rightindex=centerindex;
centerindex=parseInt((leftindex+rightindex)/2);
}
else{
leftindex=centerindex;
centerindex=parseInt((leftindex+rightindex)/2);
}
min=Math.min(rotateArray[leftindex],rotateArray[rightindex]);
}
min=Math.min(rotateArray[leftindex],rotateArray[rightindex])
return min;
}
运行环境:JavaScript (V8 6.0.0)
运行时间:94ms
占用内存:10876KB