day03-旋转数组的最小数字

45 阅读1分钟

旋转数组的最小数字

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 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]
};

感悟:

有时候不一定要用某种算法 根据题目本身的特点 找点最巧妙的解决方法 也是很开心的

题目链接

leetcode.cn/problems/xu…