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

题目描述:

思路分析:

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

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

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

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

所以,只需要比较 x 和 nums[n−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(nums[mid]<nums[n-1])的情况导致死循环。

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

相关推荐
多恩Stone11 小时前
【3D AICG 系列-8】PartUV 流程图详解
人工智能·算法·3d·aigc·流程图
铸人11 小时前
再论自然数全加和-质数的规律
数学·算法·数论·复数
历程里程碑12 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
YGGP13 小时前
【Golang】LeetCode 128. 最长连续序列
leetcode
你撅嘴真丑20 小时前
第九章-数字三角形
算法
uesowys20 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder20 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮20 小时前
AI 视觉连载1:像素
算法
智驱力人工智能20 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥21 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法