Optimal: pick the sorted half
Time O(log n) Space O(1)If nums[lo] <= nums[mid], the left half is sorted: go left when nums[lo] <= target < nums[mid], else right. Otherwise the right half is sorted: go right when nums[mid] < target <= nums[hi], else left.
nums = [4, 5, 6, 7, 0, 1, 2], target = 0Step 1/3mid = 3 (7). Left half 4..7 is sorted, and 0 isn't in [4, 7): go right. lo = 4.
class Solution {
public int search(int[] nums, int target) {
int lo = 0, hi = nums.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (nums[mid] == target) return mid;
if (nums[lo] <= nums[mid]) { // left half sorted
if (nums[lo] <= target && target < nums[mid]) hi = mid - 1;
else lo = mid + 1;
} else { // right half sorted
if (nums[mid] < target && target <= nums[hi]) lo = mid + 1;
else hi = mid - 1;
}
}
return -1;
}
}Verdict: One pass of binary search.