33. 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.

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.

原文地址:https://www.cnblogs.com/wentiliangkaihua/p/10329818.html