力扣hot100:寻找旋转排序数组中的最小值

题目描述:

思路分析:

本题可以借用二分查找的思路:设 x=numsmid 是现在二分取到的数。我们需要判断 x 和数组最小值的位置关系,谁在左边,谁在右边?把 x 与最后一个数 numsn−1 比大小:

如果 x>numsn−1,那么可以推出以下结论:1.nums 一定被分成左右两个递增段;2.第一段的所有元素均大于第二段的所有元素;3.x 在第一段。4.最小值在第二段。5.所以 x 一定在最小值的左边。

如果 x≤numsn−1,那么 x 一定在第二段。(或者 nums 就是递增数组,此时只有一段。)

x 要么是最小值,要么在最小值右边。

所以,只需要比较 x 和 numsn−1 的大小关系,就间接地知道了 x 和数组最小值的位置关系,从而不断地缩小数组最小值所在位置的范围,二分找到数组最小值。

代码:

java 复制代码
class Solution {
    public int findMin(int[] nums) {
        int n=nums.length;
        int right=n-1;
        int left=0;
        while(left<right){
            int mid=(right-left)/2+left;
            if(nums[mid]<nums[n-1]){
                right=mid;
            }else{
                left=mid+1;
            }
        }
        return nums[right];
    }
}

代码分析:

终止条件为left<right,如果是<=则可能会一直走if(numsmid<numsn-1)的情况导致死循环。

left=mid+1是因为如果mid在第一段,则最小值一定在left的右边。

相关推荐
地平线开发者8 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者8 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月11 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星12 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星12 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与1 天前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络2 天前
论最小 Agent 计算机的形态
算法
kisshyshy2 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法