中点值与左侧端点比较
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 31 32 33 34 35 36 37 38 39
| class Solution { public int search(int[] arr, int target) { int left = 0, right = arr.length - 1; while (left <= right) { if (arr[left] == target) { return left; }
int mid = (left + right) >>> 1; if (arr[mid] == target) { right = mid; } else { if (arr[left] < arr[mid]) { if (arr[left] <= target && target < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } else if (arr[left] > arr[mid]) { if (arr[mid] < target && target <= arr[right]) { left = mid + 1; } else { right = mid - 1; } } else { left++; } } }
return -1; } }
|
中点值与右侧端点比较
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 31 32 33 34 35 36 37 38 39
| class Solution { public int search(int[] arr, int target) { int left = 0, right = arr.length - 1; while (left <= right) { if (arr[left] == target) { return left; }
int mid = (left + right) >>> 1; if (arr[mid] == target) { right = mid; } else { if (arr[mid] < arr[right]) { if (arr[mid] < target && target <= arr[right]) { left = mid + 1; } else { right = mid - 1; } } else if (arr[mid] > arr[right]) { if (arr[left] < target && target < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } else { right--; } } }
return -1; } }
|
关键点在于最左侧是目标值时直接返回,否则 arr = [5, 5, 5, 1, 2, 3, 4, 5],target = 5 不能 AC。
References
面试题 10.03. 搜索旋转数组