Sunday, May 28, 2017

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.



Solution:

The idea is use binary search to find the target.

When we have mid, we check:

1. If nums[start] < nums[mid]

  a). target >= nums[start] && target < nums[mid]. ==> search from start to mid.

  b). target < nums[start] || target >= nums[mid]. ==> search from mid to end (still a rotated sorted array)

2. If nums[start] >= nums[mid]

  a).  target > nums[mid] && target <= nums[end]. ==> search from mid to end.

  b). target <= nums[mid] || target > nums[end]. ==> search from start to mid. (still a rotated sorted array)

Thus, the time complexity is still O(logn).



Code:


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 + 1 < end) {
            int mid = start + (end - start) / 2;
            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;
    }
}