java数据结构与算法刷题-----LeetCode153. 寻找旋转排序数组中的最小值

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

二分查找

解题思路:时间复杂度O( l o g 2 n log_2n log2n),空间复杂度O( 1 1 1)
  1. 题目的意思是,目前的数组,是一个升序序列旋转后的结果,我们还原后,返回整个序列最小的值即可
  2. 它这个旋转操作是什么?例如[1,2,3]旋转一次为[2,3,1],继续旋转一次为[3,1,2],再一次为[1,2,3]

我们发现就是将第一个元素旋转到后面,然后其它元素前移一位而已

  1. 则会出现一个很重要的信息,我们不断将前面较小的值,旋转到后面
  2. 也就是旋转后的数组分为两部分,[前移的A,旋转到后面的B],A部分每个值都>B的每个值。

例如[1,2,3,4,5]旋转两次为[3,4,5,1,2],我们发现B部分全部小于A部分,而且B部分的第一个值1就是最小值

  1. 所以我们二分查找时,如果mid落在A部分,而right在B部分,会出现nums[mid]>nums[right]的情况,此时我们要将mid移到A部分,让left = mid+1
  2. 而如果我们mid落在A部分,right也在A部分,会出现mid<=right的情况,所以需要到mid左边找,也就是right = mid
  3. 直到找到B部分的第一个元素为止
代码

在这里插入图片描述

class Solution {
    public int findMin(int[] nums) {
        int low = 0,high = nums.length - 1;
        while (low < high) {
            int mid = low + (high - low) / 2 ;//二分查找
            if (nums[mid] < nums[high]) {//如果当前mid比high小,说明处于后面的升序序列
                high = mid;//则去mid左边找
            } else {//如果mid>=high,说明处于前面的升序序列
                low = mid + 1;//从mid右边找
            }
        }
        return nums[low];
    }
}
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值