class Solution {
public boolean search(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l <= r) {
// to avoid duplicates
while (l < r && nums[l] == nums[l + 1]) ++l;
while (l < r && nums[r] == nums[r - 1]) --r;
int m = l + (r - l) / 2;
int num = (nums[m] < nums[0]) == (target < nums[0])
? nums[m]
: target < nums[0] ? Integer.MIN_VALUE : Integer.MAX_VALUE;
if (num < target) {
l = m + 1;
} else if (num > target) {
r = m - 1;
} else {
return true;
}
}
return false;
}
}