代码重构:leetcode 33. 搜索旋转排序数组

33. 搜索旋转排序数组

这题显然也可以像官方题解那样,把题目分成几个条件,按条件来收缩,但我总觉得不必那样。

我们按照之前写题的套路,需要确定解空间。当非满足解空间时候就要跳过,收缩到解空间。

于是我们这题就可以按以下思路来:

    1. 先判断解空间在左边还是右边
    2. 当不满足解空间的时候收缩,比如mid是在左边,而解空间在右边,那么很显然要将左边界搜索,同理可得当解空间在左边,mid在右边时候,就像左收缩。简而言之,当mid不在解空间的时候,可以直接收缩,不用其他判断。
    3. 满足解空间了就正常二分查找

于是这样代码就好看和好理解了很多。如下

    public int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        int border = nums.length - 1;
        boolean left = target > nums[border];
        while (low <= high) {
            int mid = (low + high) >>> 1;
            if (left && nums[mid] < nums[border]) {
                high = mid - 1;
                continue;
            }
            if (!left && nums[mid] > nums[border]) {
                low = mid + 1;
                continue;
            }
            if (nums[mid] < target) low = mid + 1;
            else if (nums[mid] > target) high = mid - 1;
            else return mid;
        }
        return -1;
    }
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享