搜索旋转排序数组

简介: 搜索旋转排序数组

公众号merlinsea


题目描述


   整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转。使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。


链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array


示例


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


解题思路


采用二分查找,不断的压缩一半的元素,直到最后找到或者无条件可以找为止。但本题中数组旋转了,那么怎么样才能判断应该向左压缩还是应该向右压缩呢?核心点:


1、如何判断数组[left,right]区间是否发生了反转

2、在[left,right]区间有反转的情况下如何判断mid是落在左半部分还是右半部分

3、前两步完成的情况下,如何判断应该移动左指针还是移动右指针。

640.jpg

代码

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[left] < nums[right]){
                //说明整个数组从[left,right]区间升序
                if(target==nums[mid]){
                    return mid;
                }else if(target>nums[mid]){
                    left = mid+1;
                }else{
                    right = mid-1;
                }
            }else{
                //说明整个数组从[left,right]区间是中间旋转了
                if(nums[mid]>=nums[left]){
                    //说明前半段[left,mid]是严格升序的,即mid落在前半段
                    if(target==nums[mid]){
                        return mid;
                    }else if(target>nums[mid] || target<nums[left]){
                        //4 5 6 7 8 1 2 3 
                        left = mid+1;
                    }else{
                        right = mid-1;
                    }
                }else{
                    //说明后半段[mid,right]是严格升序的,即mid落在后半段
                    if(target==nums[mid]){
                        return mid;
                    }else if(target<nums[mid] || target>nums[right]){
                        //6 7 8 1 2 3 4 5
                        right = mid-1;
                    }else{
                        left = mid+1;
                    }
                }
            }
        }
        return -1;
    }
}
相关文章
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
3月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
3月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
5月前
|
存储 算法 数据挖掘
LeetCode 题目 81:搜索旋转排序数组 II
LeetCode 题目 81:搜索旋转排序数组 II
|
6月前
|
算法 测试技术 C#
【二分查找】【z型搜索】LeetCode240:搜索二维矩阵
【二分查找】【z型搜索】LeetCode240:搜索二维矩阵
|
算法 索引
【Leetcode】1480. 一维数组的动态和、35. 搜索插入位置
目录 1480. 一维数组的动态和 35. 搜索插入位置
31 0
|
算法 安全 Swift
LeetCode - #33 搜索旋转排序数组(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
每日三题-寻找两个正序数组的中位数 、搜索旋转排序数组、 在排序数组中查找元素的第一个和最后一个位置
每日三题-寻找两个正序数组的中位数 、搜索旋转排序数组、 在排序数组中查找元素的第一个和最后一个位置
57 2
每日三题-寻找两个正序数组的中位数 、搜索旋转排序数组、 在排序数组中查找元素的第一个和最后一个位置