旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
示例:
输入: numbers = [3,4,5,1,2]
输出: 1
输入: numbers = [2,2,2,0,1]
输出: 0
解法:
//解法1:重新排序
var minArray = function(numbers) {
numbers.sort((a,b)=>a-b)
return numbers[0]
};
//解法2:遍历--n
var minArray = function(numbers) {
let min=numbers[0];
for(let i=1;i<numbers.length;i++){
if(numbers[i]<min){
min=numbers[i];
}
}
return min;
};
//解法3:遍历优化 找到转折点 因为数组局部有序,所以只要后一位比前一位小 那个这个就是转折点即最小的元素
var minArray = function(numbers) {
let min=numbers[0];
for(let i=1;i<numbers.length;i++){
if(numbers[i]<min){
return numbers[i]
}
}
return min;
};
// 解法4:二分查找
var minArray = function(numbers) {
let start=0;let end=numbers.length-1;
while(start<end){
let middle=start+Math.floor((end-start)/2)
if(numbers[middle]>numbers[end]){
start=middle+1;
}else if(numbers[middle]<numbers[end]){
end=middle
}else{
end--;
}
}
return numbers[start]
};
感悟:
有时候不一定要用某种算法 根据题目本身的特点 找点最巧妙的解决方法 也是很开心的