codeTop100题(13)33. 搜索旋转排序数组

89 阅读1分钟

1. 题目

33. 搜索旋转排序数组

2. 分析

  • mid 等于target的时候,直接返回
  • mid 小于target的时候

image.png

  • mid 大于target的时候

image.png

3. 代码

class Solution {
    public static int search(int[] nums, int target) {
        int l = 0, r = nums.length - 1, mid;
        while (l <= r) {
            mid = (l + r) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                if (nums[0] >= nums[nums.length - 1] && nums[mid] >= nums[0] && target <= nums[nums.length - 1]) {
                    l = mid + 1;
                    continue;
                }
                r = mid - 1;
            } else {
                if (nums[0] >= nums[nums.length - 1] && target >= nums[0] && nums[mid] <= nums[nums.length - 1]) {
                    r = mid - 1;
                    continue;
                }
                l = mid + 1;
            }
        }
        return -1;
    }
}

4. 总结

本题卡最久的时候是确认红色框内的条件,最开始没有想清楚什么条件,先尝试了mid 和 target 与各自边界比较,不行,后面又加上了最左边和最右边的比较才行。最终其实就是在以下条件:要特殊处理:有序数组被分成了两片且mid和target各自在分开的两片上