hot100-53搜索旋转排序数组

一、题目

nums升序排列,值互不相同,经过k次旋转,找出target的下标,如果没有返回-1。

二、思路

每次比较 nums[mid]nums[left]nums[right],判断 mid 在哪一段,再决定如何缩小范围。

  1. 如果 nums[left] <= nums[mid]

→ 左半段 [left, mid]升序的

  • target 在这个范围内(即 left <= target <= mid),则在左半段找

  • 否则,在右半段找

  1. 如果 nums[left] > nums[mid]

→ 右半段 [mid, right]升序的

  • target 在这个范围内(即 mid <= target <= right),则在右半段找

  • 否则,在左半段找

总结:利用旋转数组"两段有序"的特性,通过比较 nums[mid]nums[left]nums[right] 判断哪一半是有序的,然后根据 target 是否落在该有序段内来决定搜索方向,实现高效的二分查找。

三、代码

复制代码
class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while(left <= right){
            int mid = left + (right - left) /2;
            if(target == nums[mid]) return mid;
            if(nums[left] < nums[mid]){
                if(target>=nums[left] && target < nums[mid]){
                    right = mid -1;
                }else{
                    left = mid + 1;
                }
            }else{
                if(target>nums[mid] && target <= nums[right]){
                    left = mid+1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}

总结:通过判断哪一段有序,再看 target 是否在该段的值域内,决定搜索方向

相关推荐
QiLinkOS16 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
如此这般英俊17 小时前
手撕Claude Code—第一章 agent-loop
数据结构·人工智能·语言模型·自然语言处理
小白兔奶糖ovo17 小时前
【Leetcode】231. 2的幂
linux·算法·leetcode
xiaoxiaoxiaolll17 小时前
《Light: Science & Applications》合并BIC实现80倍阈值单模运行:超紧凑光子晶体激光器新突破
人工智能·算法·机器学习
Peter·Pan爱编程17 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程
-To be number.wan17 小时前
算法日记 | 暴力枚举
学习·算法
s_w.h17 小时前
【 linux 】动静态库的制作
linux·运维·服务器·算法·bash
过期动态18 小时前
【LeetCode 热题 100】接雨水
java·数据结构·算法·leetcode·职场和发展
春日见18 小时前
5分钟入门强化学习之动态规划算法与实现
大数据·人工智能·python·算法·机器学习·计算机视觉
scx_link18 小时前
线性回归的总结:
算法·机器学习·线性回归