【二分查找】LeetCode 33. 搜索旋转排序数组思路

题目链接

33. 搜索旋转排序数组思路

思路

都在注释里

代码

class Solution {
    public int search(int[] nums, int target) {
        int len = nums.length;
        if(len == 0){
            return -1;
        }
        int left = 0, right = len - 1;
        // 1. 首先明白,旋转数组后,从中间划分,一定有一边是有序的。
        // 2. 由于一定有一边是有序的,所以根据有序的两个边界值来判断目标值在有序一边还是无序一边
        // 3. 这题找目标值,遇到目标值即返回
        // 4. 注意:由于有序的一边的边界值可能等于目标值
        // 所以判断目标值是否在有序的那边时应该加个等号(在二分查找某个具体值的时候如果把握不好边界值
        // 可以在每次查找前判断下边界值,也就是while循环里面的两个if注释)
        while(left <= right){
            // if(nums[left] == target) return left;
            // if(nums[right] == target) return right;

            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                return mid;
            }
            // 右边有序
            if(nums[mid] < nums[right]){
                // 目标值在右边
                if(target > nums[mid] && target <= nums[right]){
                    left = mid + 1;
                    // 目标值在左边
                }else{
                    right = mid - 1;
                }
                // 左边有序
            }else{
                // 目标值在左边
                if(target >= nums[left] && target < nums[mid]){
                    right = mid - 1;
                    // 目标值在右边
                }else{
                    left = mid + 1;
                }
            }
        }
        return -1;
    }
}
posted @   Frodo1124  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示