while (start < end && nums[start] == nums[start +1])start++;while (start < end && nums[end] == nums[end -1]) end--;
Solution
Template #3 (compare nums[mid] vs nums[right]) - (1 ms, faster than 56.43%)
classSolution {publicbooleansearch(int[] nums,int target) {if (nums ==null||nums.length==0) {returnfalse; }int left =0, right =nums.length-1;while (left +1< right) {int mid = left + (right - left) /2;if (target == nums[mid]) {returntrue; }if (nums[mid] < nums[right]) {// right part is sorted, left part is rotated if (target > nums[right] || target < nums[mid]) {// target is in rotated part right = mid; } else { left = mid; } } elseif (nums[mid] > nums[right]) {// left part is sorted, right part is rotated if (target < nums[left] || target > nums[mid]) {// target is in rotated part left = mid; } else { right = mid; } } else { right--; } }if (nums[left] == target || nums[right] == target) {returntrue; }returnfalse; }}
@hpplayer Template #1 (compare nums[mid] vs nums[left]) - ()
publicbooleansearch(int[] nums,int target) {int start =0, end =nums.length-1;//check each num so we will check start == end//We always get a sorted part and a half part//we can check sorted part to decide where to go nextwhile(start <= end){int mid = start + (end - start)/2;if(nums[mid] == target) returntrue;//if left part is sortedif(nums[start] < nums[mid]){if(target < nums[start] || target > nums[mid]){//target is in rotated part start = mid +1; }else{ end = mid -1; } }elseif(nums[start] > nums[mid]){//right part is rotated//target is in rotated partif(target < nums[mid] || target > nums[end]){ end = mid -1; }else{ start = mid +1; } }else{//duplicates, we know nums[mid] != target, so nums[start] != target//based on current information, we can only move left pointer to skip one cell//thus in the worest case, we would have target: 2, and array like 11111111, then//the running time would be O(n) start ++; } }returnfalse;}