首页 > 其他分享 >【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值

【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值

时间:2023-04-28 09:24:35浏览次数:59  
标签:153 right 右值 int mid 最小值 LeetCode left

题目链接

153. 寻找旋转排序数组中的最小值

思路

首先分析一下旋转数组可能有的状态:

  1. 左 < 中 < 右,此时最小值肯定在左边,应当收缩右边界
  2. 左 < 中,中 > 右,此时最小值肯定在右半段,应当收缩左边界
  3. 左 > 中,中 < 右,此时最小值肯定在左半段,应当收缩右边界

分析这三种状态可以发现,中值小于右值时收缩右边界,否则收缩左边界

那么当中值等于右值时呢?因为本题没有重复元素且使用的是地板除,即 mid 更靠近 left,所以当中值与右值相等时说明 \(left = right\),此时早已退出循环了。

代码

class Solution {
    public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while(left < right){
            // 经典操作防止溢出
            // 地板除,mid更靠近left
            int mid = (right - left) / 2 + left;
            // 中值 > 右值,最小值在右半边,收缩左边界
            if(nums[mid] > nums[right]){
                left = mid + 1;
            }else{
                // 中值 < 右值,最小值在左半边,收缩右边界
                // 因为中值 < 右值,中值也可能是最小值,右边界只能取到mid处
                right = mid;
            }
        }

        return nums[left];
    }
}

标签:153,right,右值,int,mid,最小值,LeetCode,left
From: https://www.cnblogs.com/shixuanliu/p/17360912.html

相关文章

  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......
  • #yyds干货盘点# LeetCode程序员面试金典:外观数列
    题目:给定一个正整数n,输出外观数列的第n项。「外观数列」是一个整数序列,从数字1开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1)="1"countAndSay(n)是对countAndSay(n-1)的描述,然后转换成另一个数字字符串。前五项......
  • 【哈希表】LeetCode 895. 最大频率栈
    题目链接895.最大频率栈思路很容易想到使用map:valToFreq来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。这时候我想到再加一个map:freqToVal来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal的键值对类型选择<......
  • 代码随想录Day38-Leetcode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
    咳咳,因为找实习+摆导致时间被浪费大半;先从动态规划学起吧,之前的慢慢补。理论基础动态规划的解题步骤1.确定dp数组及对应下标的含义2.确定dp的状态转移方程(递推公式)3.确定dp数组如何初始化4.确定dp遍历顺序5.距离推导dp数组验证509.斐波那契数题目链接:https://le......
  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......
  • 不使用内置函数的情况下,如何使用Python实现求平均值、最大值和最小值?
    今日鸡汤寂寂竟何待,朝朝空自归。大家好,我是Python进阶者。一、前言昨天在Python最强王者交流群【鱼鱼鱼也不】问了一个Pandas处理的问题,下图是讨论截图:下图是他的原始数据:其实一开始是有点难以理解的。其实这个就是想判断两列的情况,用一列值填充另一列值。二、实现过程这里【猫药......
  • leetcode-350-两个数组的交集 II 题解
    题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果......
  • 1351. 统计有序矩阵中的负数(leetcode)
    https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/1351.统计有序矩阵中的负数1.二分法:把每一行进行一遍二分,找到正数与负数的边界,且此时grid[i][mid]也为负数,即边界下标的对应值是负数的左半边界那么一行中的个数即为size()-lclassSolution{pu......
  • #yyds干货盘点# LeetCode程序员面试金典:解数独
    题目:编写一个程序,通过填充空格来解决数独问题。数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 '.' 表示。 示例1......
  • #yyds干货盘点# LeetCode面试题:合并两个有序数组
    1.简述:给你两个按非递减顺序排列的整数数组 nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......