LeetCode hot100-67-N

https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/description/?envType=study-plan-v2\&envId=top-100-liked

java 复制代码
153. 寻找旋转排序数组中的最小值
已解答
中等
相关标签
相关企业
提示
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
java 复制代码
class Solution {
    public int findMin(int[] nums) {
        int l=0,r=nums.length-1;
        //int min = nums[0];
        while(l<r){
            int mid=(l+r)/2;
            // 在左边
            if(nums[mid]<nums[r]){
                r=mid;
            // 在右边
            } else{
                l=mid+1;
            }

        }
        return nums[l];
        
    }
}

为什么不能更新high = mid - 1?

想象一种情况,【4, 5, 6, 0, 1, 2, 3】这个数组右半段为0, 1, 2, 3,左半段为4,5,6, 第一次判断中点mid将落在0的位置,此时若:

令high = mid -1。你会发现出了问题,因为此时的high变成了0元素的前一位:元素6的位置!而low位置没动,新的数组变成了【4, 5, 6】,这样我们就把最小值0漏掉了。

为什么中间元素与右边元素比较,而不是与左边元素比较。解释如下

相关推荐
XiYang-DING3 小时前
【LeetCode】Hash | 136.只出现一次的数字
算法·leetcode·哈希算法
Tairitsu_H4 小时前
C语言:排序(一)
c语言·数据结构·排序
嘻嘻哈哈樱桃5 小时前
俄罗斯套娃信封问题力扣--354
算法·leetcode·职场和发展
田梓燊5 小时前
2026/4/12 leetcode 1320
算法·leetcode·职场和发展
j_xxx404_5 小时前
力扣题型--链表(两数相加|两两交换链表中的节点|重排链表)
数据结构·c++·算法·leetcode·蓝桥杯·排序算法
_日拱一卒6 小时前
LeetCode:240搜索二维矩阵Ⅱ
数据结构·线性代数·leetcode·矩阵
WolfGang0073216 小时前
代码随想录算法训练营 Day33 | 动态规划 part06
算法·leetcode·动态规划
米粒16 小时前
力扣算法刷题 Day 41(买卖股票)
算法·leetcode·职场和发展
计算机安禾7 小时前
【数据结构与算法】第44篇:堆(Heap)的实现
c语言·开发语言·数据结构·c++·算法·排序算法·图论
汀、人工智能7 小时前
[特殊字符] 第91课:课程表
数据结构·算法·数据库架构·图论·bfs·课程表