33. 搜索旋转排序数组
这题显然也可以像官方题解那样,把题目分成几个条件,按条件来收缩,但我总觉得不必那样。
我们按照之前写题的套路,需要确定解空间。当非满足解空间时候就要跳过,收缩到解空间。
于是我们这题就可以按以下思路来:
-
- 先判断解空间在左边还是右边
- 当不满足解空间的时候收缩,比如mid是在左边,而解空间在右边,那么很显然要将左边界搜索,同理可得当解空间在左边,mid在右边时候,就像左收缩。简而言之,当mid不在解空间的时候,可以直接收缩,不用其他判断。
- 满足解空间了就正常二分查找
于是这样代码就好看和好理解了很多。如下
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