题目大意:与33题类似,只是这里数组中有重复数值。
法一:解法与33题类似,只是这里要处理1,3,1,1,1这种情况,即有重复值时,mid与left和right都相等时,可以采用right--的方式错开相等值再比较。代码如下(耗时2ms):
1 public boolean search(int[] nums, int target) { 2 int left = 0, right = nums.length - 1; 3 while(left <= right) { 4 int mid = (left + right) / 2; 5 if(nums[mid] == target || nums[left] == target || nums[right] == target) { 6 return true; 7 } 8 //如果左数组有序 9 else if(nums[left] < nums[mid]) { 10 //如果target在左数组中 11 if(target < nums[mid] && target > nums[left]) { 12 right = mid - 1; 13 } 14 else { 15 left = mid + 1; 16 } 17 } 18 //如果右数组有序 19 else if(nums[mid] < nums[right]){ 20 //如果target在右数组中 21 if(target < nums[right] && target > nums[mid]) { 22 left = mid + 1; 23 } 24 else { 25 right = mid - 1; 26 } 27 } 28 //如果出现1,3,1,1,1的情况,mid值与left和right都相等,则将right--再比较 29 else { 30 right--; 31 } 32 } 33 return false; 34 }