🌕 🌗 33. 搜索旋转排序数组

吞佛童子2022年10月10日
  • algorithm
  • array
  • 二分
小于 1 分钟

🌕 🌗 33. 搜索旋转排序数组

难度: 🌕 🌗

问题描述

img_3.png


解法

class Solution {
    public int search(int[] nums, int target) {
        // 思路:
        // 二分
        int len = nums.length;
        return mySol(nums, target, 0, len - 1);
    }

    private int mySol(int[] nums, int target, int left, int right) {
        // System.out.println(nums[left] + "  " + nums[right]);
        // 递归终止条件
        if(left >= right) {
            if(nums[left] == target) {
                return left;
            } else {
                return -1;
            }
        }
        if(nums[left] == target) {
            return left;
        }
        if(nums[right] == target) {
            return right;
        }
        // left < right
        int mid = left + ((right - left) >> 1); // 偏左的 mid
        if(nums[mid] == target) {
            return mid;
        } 
        // 判断区间是否有旋转点
        if(nums[right] > nums[mid] && nums[mid] >= nums[left]) {
            // 单增
            if(target > nums[mid]) {
                return mySol(nums, target, mid + 1, right); // 右区间
            } else {
                return mySol(nums, target, left, mid - 1);
            }
        }
        // mid 右侧有旋转点,意味着左侧单增
        if(nums[mid] >= nums[left]) {
            if(target > nums[mid]) {
                return mySol(nums, target, mid + 1, right);
            } else {
                // target < [mid]
                if(target > nums[left]) {
                    return mySol(nums, target, left, mid - 1);
                } else {
                    // target < [left]
                    return mySol(nums, target, mid + 1, right);
                }
            }
        }
        // mid 左侧有旋转点,意味着右侧单增
        if(nums[right] > nums[mid]) {
            if(target > nums[mid]) {
                if(target > nums[right]) {
                    return mySol(nums, target, left, mid - 1); // 左
                } else {
                    return mySol(nums, target, mid + 1, right);
                }
            } else {
                return mySol(nums, target, left, mid - 1);
            }
        }
        return -1;
    }
}

输出

img_2.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou