力扣中等 33.搜索旋转排序数组

文章目录

题目介绍


题解

首先用 153. 寻找旋转排序数组中的最小值 的方法,找到 nums 的最小值的下标 i。

然后分类讨论:

  1. 如果 target>nums[n−1],在 [0,i−1] 中二分查找 target。

  2. 如果 target≤nums[n−1],那么:

    1. 如果 i=0,说明 nums 是递增的,直接在 [0,n−1] 中二分查找 target。

    2. 如果 i>0,那么 target 一定在第二段 [i,n−1] 中,在 [i,n−1] 中二分查找 target。

      ++这两种情况可以合并成:在 [i,n−1] 中二分查找 target++。

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length, i = findMin(nums);
        if (target > nums[n - 1]) { // target 在第一段
            return lowerBound(nums, 0, i - 1, target); 
        }
        // target 在第二段
        return lowerBound(nums, i, n - 1, target); 
    }

    // 153. 寻找旋转排序数组中的最小值
    private int findMin(int[] nums) {
        int left = 0, right = nums.length - 2; // 闭区间 [0, nums.length - 2]
        while (left <= right) { 
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[nums.length - 1]) {
                right = mid - 1; 
            } else {
                left = mid + 1;               
            }
        }
        return left;
    }

    // 有序数组中找 target 的下标
    private int lowerBound(int[] nums, int left, int right, int target) {
        while (left <= right) { 
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                return mid;
            }else if (nums[mid] < target) {
                left = mid + 1; 
            } else {
                right = mid - 1; 
            }
        }
        return -1;
    }
}```
相关推荐
嗑嗑嗑瓜子的猫10 分钟前
Java!它值得!
java·开发语言
墨尘笔尖1 小时前
最大最小值降采样算法的优化
c++·算法
2401_895521341 小时前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
皮卡蛋炒饭.1 小时前
线程的概念和控制
java·开发语言·jvm
一只大袋鼠2 小时前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
程序员老邢2 小时前
【人生底稿・番外篇 05】我的电影江湖:从录像带时代,到港片陪伴的青春岁月
java·程序人生·职场发展·娱乐
sonnet-10292 小时前
函数式接口和方法引用
java·开发语言·笔记
Bat U2 小时前
JavaEE|多线程(二)
java·开发语言
_Evan_Yao2 小时前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
自我意识的多元宇宙2 小时前
二叉树的遍历和线索二叉树--二叉树的遍历
数据结构