您的位置:首页 > 其它

leetcode 33. Search in Rotated Sorted Array

2016-08-06 18:52 483 查看
Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 
0 1 2 4 5 6 7
 might become 
4
5 6 7 0 1 2
).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

分析:

给出一个旋转的有序数组,所谓的旋转就是在原有的有序数组某个位置把数组分为两部分,把后半部分平移到前面来。

比如: 0  1  2   4  5  6   7  ,

从2和4之间分开,前半部分是0   1   2 ,后半部分是 4   5  6   7  ,把后面的前移变成了 4  5  6  7  0   1  2  。

寻找target的时候,分为两种情况。

(后有附图)

(1)mid在第一个上升区间,也就是4  5  6  7 。

        如果在这个区间,那么nums[start]是小于nums[mid]的。寻找target分了两种情况,

       第一种,target在start和mid之间,也就是在第一个上升区间的前半部分,这样将end结点前移。

       第二种,target不在start和mid之间,start后移。

(2)mid在第二个上升区间,也就是 0  1  2 

       如果在这个区间呢,那么nums[mid]是小于nums[end]的。寻找target分了两种情况,

       第一种,target在mid和end之间,也就是在第二个上升区间的后半部分,这样将start结点后移。

       第二种,target不在mid和end之间,end前移。

public class Solution {
public int search(int[] nums, int target) {
if (nums.length == 0){
return -1;
}

int start = 0, end = nums.length - 1;

while (start + 1 < end){
int mid = start + (end - start)/2;
if(nums[mid] == target){
return mid;
}
if (nums[start] < nums[mid]){
if (target >= nums[start] && target <= nums[mid]){
end = mid;
}else{
start = mid;
}
}else{
if (target >= nums[mid] && target <= nums[end]){
start = mid;
}else{
end = mid;
}
}
}
if (nums[start] == target){
return start;
}
if (nums[end] == target){
return end;
}
return -1;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode