33.Search in Rotated Sorted Array---二分变形---《剑指offer》面试题8
题目大意:在一个旋转数组中,判断给定的target是否存在于该旋转数组中。数组中没有重复数值。例子如下:
法一:二分。确定中间元素之后,就要判断下一步是遍历左数组还是遍历右数组。如果左数组有序,且target在左数组范围内,则遍历左数组,否则遍历右数组;如果右数组有序,且target在右数组范围内,则遍历右数组,否则遍历左数组。o(lgn)。代码如下(耗时15ms):
1 public int 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) { 6 return mid; 7 } 8 //如果左半段有序 9 else if(nums[left] <= nums[mid]) { 10 //如果target在左半段范围内 11 if(nums[left] <= target && nums[mid] > target) { 12 right = mid - 1; 13 } 14 //虽然左半段有序,如果target不在左半段范围内,则向右遍历右半段 15 else { 16 left = mid + 1; 17 } 18 } 19 //如果右半段有序 20 else { 21 //如果target在右半段范围内 22 if(nums[right] >= target && nums[mid] < target) { 23 left = mid + 1; 24 } 25 //虽然右半段有序,如果target不在右半段范围内,则向左遍历左半段 26 else { 27 right = mid - 1; 28 } 29 } 30 } 31 return -1; 32 }