LeetCode —— 二分查找
33. 搜索旋转排序数组
- 翻转点在前半部分 nums[mid]<=nums[low]
- 而后半部分是单调递增的,比较好判断。可以判断 nums[mid] < target <= nums[high] 去后半部分
- else 去后半部分
- 翻转点在后半部分 nums[mid]<=nums[low]
- 而前半部分是单调递增的,比较好判断。可以判断 nums[low] <= target < nums[mid] 去前半部分
- else 去前半部分
class Solution { public int search(int[] nums, int target) { int low =0; int high = nums.length-1; // 注意条件是 low<=high while(low <= high) { // [3,1] target 是 1 的情况,如果这里没有 +1,low,mid是0,那high=mid-1就是-1了 int mid = (low+high+1)/2; if (target == nums[mid]) { return mid; } // 翻转点在前半部分。后半部分是单调递增的 if (nums[mid] <= nums[low]) { // 后半部分是单调递增的。这里是去后半部分的情况 if (target > nums[mid] && target <= nums[high]) { low = mid+1; } else { high = mid-1; } } // 翻转点在后半部分+正好在中点。前半部分是单调递增的。 else { // 前半部分是单调递增的。这里是去前半部分的情况 if (target >= nums[low] && target< nums[mid]) { high = mid - 1; } else { low = mid + 1; } } } return -1; } }