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.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2]
, target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2]
, target = 3
Output: -1
class Solution { public int search(int[] nums, int target) { if(nums.length == 0 || nums == null) return -1; int left = 0, right = nums.length - 1; while(left <=right){ int mid = left + (right - left)/2; if(nums[mid]==target) return mid; else if(nums[mid] < nums[left]){ if(target > nums[mid] && target <= nums[right]) left = mid +1; else right = mid-1; } else if(target< nums[mid] && target >= nums[left]) right = mid-1; else left = mid+1; } return -1; } }
二分法,关键在找分界点。
参考 http://www.cnblogs.com/grandyang/p/4325648.html
总结:
Since the array is partial sorted, we use binary search to save time. Aftrer getting the mid point, the key point is to find which part is sorted. So we compare mid with left, if mid > left means left part is sorted, then we shrink our range by comparing the target number with left part sorted array, cuz we know it is exactly correct. Only if it's sorted, we can compare.
If mid < left, means the rotate part is in the left, and right part should be sorted. We do the same as above.