leetcode33.搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

复制代码
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:

复制代码
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:

复制代码
输入:nums = [1], target = 0
输出:-1

思路:直接先按照正常情况写代码 然后考虑异常情况;详情见下面代码:

java 复制代码
public int search(int[] nums, int target) {
        int low=0;
        int high=nums.length-1;
        int mid=low+(high-low)/2;
        while(low<=high){
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]<target){
                // 异常情况:右边区间是有序的且右边最大值也<target
                if(nums[mid]<=nums[high]&&nums[high]<target)
                    high=mid-1;
                    // 正常应该到右边区间找
                else
                    low=mid+1;
            }

            else if(nums[mid]>target){
                //异常情况:左边区间有序且最小值也>target
                if(nums[mid]>=nums[low]&&nums[low]>target)
                    low=mid+1;
                    // 正常情况应该到左边区间找
                else
                    high=mid-1;
            }

            mid=low+(high-low)/2;
        }
        return -1;
    }
相关推荐
Swift社区1 天前
LeetCode 465 最优账单平衡
算法·leetcode·职场和发展
聆风吟º1 天前
【数据结构手札】空间复杂度详解:概念 | 习题
java·数据结构·算法
weixin_445054721 天前
力扣热题51
c++·python·算法·leetcode
地平线开发者1 天前
linux 常见稳定性问题分析方法
算法·自动驾驶
s砚山s1 天前
代码随想录刷题——二叉树篇(九)
算法
地平线开发者1 天前
大模型常见量化方法简介
算法·自动驾驶
not coder1 天前
树形结构,从零到工业级评论系统
数据结构
smj2302_796826521 天前
解决leetcode第3801题合并有序列表的最小成本
数据结构·python·算法·leetcode
栗少1 天前
英语自学手册:系统化进阶指南基于《英语自学手册》的方法论与行动路径
人工智能·算法
Xの哲學1 天前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算