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;
    }
相关推荐
xlq223223 小时前
22.多态(上)
开发语言·c++·算法
666HZ6663 小时前
C语言——高精度加法
c语言·开发语言·算法
sweet丶3 小时前
iOS MMKV原理整理总结:比UserDefaults快100倍的存储方案是如何炼成的?
算法·架构
云里雾里!4 小时前
力扣 209. 长度最小的子数组:滑动窗口解法完整解析
数据结构·算法·leetcode
CoderYanger5 小时前
递归、搜索与回溯-穷举vs暴搜vs深搜vs回溯vs剪枝:12.全排列
java·算法·leetcode·机器学习·深度优先·剪枝·1024程序员节
憨憨崽&5 小时前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
chem41116 小时前
C 语言 函数指针和函数指针数组
c语言·数据结构·算法
liu****6 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
客梦7 小时前
数据结构-树结构
数据结构·笔记
CM莫问7 小时前
详解机器学习经典模型(原理及应用)——岭回归
人工智能·python·算法·机器学习·回归