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

Solution

class Solution {
    public int search(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            int midVal = nums[mid];
            if (target == midVal) {
                return mid;
            }
            int lowVal = nums[low];
            if (midVal < lowVal) { // if middle is less than lowest value
                // 6,7,0,1,2,3,4,5
                if (target < midVal || target >= lowVal) { 
                    // and target is less than middle or target is bigger than lowest value, move high closer to left side (e.g. target=7)
                    high = mid - 1;
                } else {
                    // e.g. target=5
                    low = mid + 1;
                }
            } else {
                // 2,3,4,5,6,7,0,1
                if (target > midVal || target < lowVal) {
                    // target is e.g. 6
                    low = mid + 1;
                } else {
                    // target is e.g. 2
                    high = mid - 1;
                }
            }
        }
        return -1;
    }
}

Last updated