旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
问题分析:
主要是两种方式:
1,直接找出最小的数字,输出
i,Math.min()
ii,for循环
2,二分查找
代码展示:
//1,找到给出的数组中的最小元素,输出
//2,二分查找
function minNumberInRotateArray(rotateArray)
{
//1,找出最小直接输出-- Math.min() 运行时间:140ms;占用内存:10852k
const length = rotateArray.length;
if (!length) {
return 0;
}
return Math.min(...rotateArray);//... 解构操作符,将数组转换成单个的元素
//2,找出最小直接输出-- for 运行时间:186ms;占用内存:10272k
var tmp = rotateArray[0];
for(let i=0;i<rotateArray.length;i++){
if(tmp > rotateArray[i])
tmp = rotateArray[i];
}
return tmp;
//3,二分查找 left mid right 运行时间:308ms;占用内存:19748k
if(rotateArray.length == 0)
return 0;
var left = 0;
var right = rotateArray.length-1;
while(left<right){
var mid = Math.floor((left+right)/2);//向下取整
//全部升序排列
if(rotateArray[left] < rotateArray[right])
return rotateArray[left];
if(rotateArray[left]<rotateArray[mid]){//前半部分升序
left = mid+1;
// 右子数组有序,最小值在左边
// 这里right=mid因为最小值可能就是rotateArray[mid]
} else if (rotateArray[mid] < rotateArray[right]) {
right = mid;
} else {
// 无法判断,缩小下范围
++left;
}
}
return rotateArray[left];
}
总结:
旋转数组这块介绍,更大的效果是指向二分查找,提供使用二分查找的依据
当然,for循环遍历也肯定是能用的
不过Math.min()使用的时候,其中的解构操作符,将数组转换成单个的元素(...array),还是很有用的,
可以记一下