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;
    }
相关推荐
蒙奇D索大24 分钟前
【数据结构】考研数据结构核心考点:平衡二叉树(AVL树)详解——平衡因子与4大旋转操作入门指南
数据结构·笔记·学习·考研·改行学it
怎么没有名字注册了啊26 分钟前
查找成绩(数组实现)
c++·算法
沐怡旸36 分钟前
【算法】725.分割链表--通俗讲解
算法·面试
im_AMBER2 小时前
数据结构 04 栈和队列
数据结构·笔记·学习
L_09072 小时前
【Algorithm】Day-4
c++·算法·leetcode
代码充电宝2 小时前
LeetCode 算法题【简单】20. 有效的括号
java·算法·leetcode·面试·职场和发展
海琴烟Sunshine2 小时前
leetcode 119. 杨辉三角 II python
算法·leetcode·职场和发展
小杨的全栈之路2 小时前
霍夫曼编码:数据压缩的核心算法详解(附图解 + 代码)
算法
cjinhuo2 小时前
标签页、书签太多找不到?AI 分组 + 拼音模糊搜索,开源插件秒解切换难题!
前端·算法·开源
贝塔实验室2 小时前
频偏估计方法--快速傅里叶变换(FFT)估计法
网络协议·算法·数学建模·动态规划·信息与通信·信号处理·傅立叶分析