【二分查找】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 @ 2023-05-07 10:18  Frodo1124  阅读(33)  评论(0编辑  收藏  举报