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

文章目录

题目介绍


题解

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

然后分类讨论:

  1. 如果 target>numsn−1,在 0,i−1 中二分查找 target。

  2. 如果 target≤numsn−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;
    }
}```
相关推荐
To_OC13 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮14 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
旖-旎14 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
鱟鲥鳚14 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
To_OC15 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn15 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹16 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
大模型码小白16 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
雪碧聊技术16 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划