1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public boolean search(int[] nums, int target) { int left = 0, right = nums.length - 1; while (left <= right) { int mid = (left + right) >>> 1; if (nums[mid] == target) { return true; }
if (nums[mid] < nums[right]) { if (nums[mid] < target && target <= nums[right]) { left = mid + 1; } else { right = mid - 1; } } else if (nums[mid] > nums[right]) { if (nums[left] <= target && target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else { right--; } }
return false; } }
|
该题关键之处在于处理重复元素,如 [1, 0, 1, 1, 1] 这样的数组时,首次 nums[mid] 将定位至 nums[2] = 1,此时不能判断向左侧收缩还是向右侧收缩,所以我们通过跳过重复元素来解决该问题。
References
81. Search in Rotated Sorted Array II