题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/
题目:
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.
解题思路:
看见查找、有序两个词,自动脑补二分查找。
但是,这和普通的二分查找不同,已知序列可能为全部有序,或者分两段有序。因而需对二分查找的细节进行修改。
- 若 目标值 == nums[mid],返回下标就行
- 若 目标值 > nums[mid],分为两种情况
- 若 nums[mid] > nums[end],说明在 mid 和 end 之间出现了最大值和最小值的衔接,可以断定比 mid 值大的数都在 mid 右边,start = mid + 1
- 若 nums[mid] <= nums[end],说明在 mid 和 end 之间一直都是有序递增的,大于 mid 值的目标值可能在这个序列中,也可能不在(序列中末尾最大的值在序列最前端,例如:7 0 1 2 4 5 6)。这时,我们应该比较目标值与 end 值谁大谁小
- 若目标值 > end 值,说明目标值在 mid 值的前面,end = mid - 1
- 若目标值 <= end 值,说明目标值在 mid 后面,start = mid + 1
- 若 目标值 < nums[mid],由以上可以类推
对以上思路精简一下就是代码了
public class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0)
return -1;
int start = 0;
int end = nums.length - 1;
while(start <= end) {
int mid = (start + end) / 2;
if(target == nums[mid])
return mid;
else if(target > nums[mid]) {
if(nums[mid] <= nums[end] && target > nums[end])
end = mid - 1;
else
start = mid + 1;
} else { // target < nums[mid]
if(nums[mid] >= nums[start] && target < nums[start])
start = mid + 1;
else
end = mid - 1;
}
}
return -1;
}
}
194 / 194 test cases passed.
Status: Accepted
Runtime: 304 ms
补充:网上搜了一下,发现更快的方法,应该说更加简练,思路大致相同。
参考链接:http://blog.youkuaiyun.com/linhuanmars/article/details/20525681