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     }
View Code

 

posted on 2018-06-19 11:14  二十年后20  阅读(122)  评论(0编辑  收藏  举报

导航