Search in Rotated Sorted Array
Suppose an array sorted in ascending order 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.
解题思路:
这道题的基本思路就是用二分法查找,不过因为数组虽然经过了排序,但是排序之后进行了循环位移,所以在判断的过程中多了不少步骤。
以下讨论可能发生的情况,假设二分法的开头为first,结尾为last,中间为mid:
(1)target == first ,返回所在index
(2)target < first:
a:target == last。返回last所在index
b:target > last,找不到,返回-1
c:target < last,如果target == mid,返回mid所在index,如果target > mid,令则target位于mid到last之间,令first = mid。如果target < mid,则位于first到mid之间,令last = mid。
(3)target > first:
a:target == mid,返回mid所在index,
b:target > mid,如果mid > first,则target位于mid到last之间,令first = mid。反之,target位于first到mid之间,令last = mid。
c:target < mid,则位于first到mid之间,令last = mid。
不断循环直到查找到或者first == last。
public class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0 || nums == null)
return -1;
int first = 0;
int last = nums.length-1;
while(first < last)
{
int mid;
//(1)
if(target == nums[first])
return first;
//(3)
else if(target > nums[first] )
{
mid = (first+last)/2+1;
//(3)- a
if(target == nums[mid])
return mid;
//(3)- b
else if(target > nums[mid])
{
if(nums[mid] > nums[first])
first = mid;
else
last = mid-1;
}
//(3)- c
else
last = mid-1;
}
//(2)
else
{
mid = (first+last)/2;
//(2)- b
if(target > nums[last])
return -1;
//(2)- a
else if(target == nums[last])
return last;
//(2)- c
else
{
if(target == nums[mid])
return mid;
else if(target > nums[mid])
first = mid+1;
else
{
if(nums[mid] > nums[last])
first = mid+1;
else
last = mid;
}
}
}
}
if(target == nums[first])
return first;
return -1;
}
}