2019年8月2日
旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素,例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出所有元素都大于0,若数组大小为0,请返回0。
时间限制:3秒
空间限制:32768K
首先要弄清楚什么是非减排序数组:
举例:
1,2,3,4…这是递增排列
5,4,3,2,1…这是递减排列
1,2,2,3,4,4,5,6,7,7…这是非递减排列
9,8,8,7,6,5,5,… 这是非递增排列
我的理解就是:数组内的元素从第二项开始,每一项都大于等于该项的前一项
即F(n) >= F(n-1) n>1
(有关算法实现请移步我的常用算法实现)
直接上代码
方法:二分法
运行时间:135ms
占用内存:9996k
function minNumberInRotateArray(arr){
let len = arr.length;
if(len == 0){
return 0
}
let start = 0;
let end = len -1;
while(start < end){
let middle = Math.floor((start + end)/2);
if(arr[middle] > arr[end]){ // 说明middle右边是旋转过去的
start = middle +1;
}else if(arr[middle] == arr[end]){ //数组成员重复
end = end -1
}else{
end = middle;
}
}
return arr[start] // 非减排序数组,第一个是最小的
}