当前位置: 首页 > article >正文

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) 的算法解决此问题。

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
 

提示:

n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 中的所有整数 互不相同
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

其实题目有一个隐含条件,那就是如果数组旋转过且不为递增的顺序,那么最左侧的值一定是大于最右侧的值的,所以我们根据判断下标为mid处数组的值与下标为h处的值即可锁定最小值所在的范围,如果nums[mid]小于nums[h],那么最小值可能出现在l~mid处,反之,最小值出现在mid+1~h处。

代码实现如下:

class Solution {
    public int findMin(int[] nums) {
        int l = 0;
        int h = nums.length - 1;
        while (l < h) {
            int mid = l + (h - l) / 2;
            if (nums[mid] < nums[h]) {
                h = mid;
            } else {
                l = mid + 1;
            }
        }
        return nums[l];
    }
}

 


http://www.kler.cn/a/13751.html

相关文章:

  • 电子工程有哪些SCI期刊推荐? - 易智编译EaseEditing
  • Python面试题常用函数总结
  • 【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算
  • 《花雕学AI》24:如何用万能Prompt公式与ChatGPT进行高效的对话测试
  • 卖房子真是稳赚不赔
  • 【C/C++】MySQL 为什么选择 B+ 树作为底层数据结构
  • 大数据架构(二)大数据发展史
  • 为什么要进行倾斜摄影三维模型的顶层合并?
  • GCM与CCM的动作过程
  • 软件测试好学习吗?
  • rpm命令查询和取包中内容
  • Unity-ML-Agents--Learning-Environment-Design-Agents.md-代码解读(2)
  • Microsoft Defender for Identity部署方案
  • 代码生涯冲常见的的bug.例如layui表格中日期自动生成、eacharts 报表的重复点击事件
  • vue监听事件
  • 由浅入深MFC学习摘记--第四部分上
  • 微信小程序对接在线客服系统,对接小程序订阅消息模板,小程序订阅方法以及后端发送订阅模板消息的方法...
  • 车载软件架构——闲聊几句AUTOSAR BSW(一)
  • AI算力碎片化:矩阵乘法的启示
  • AD9208之8通道高速采集