【Leetcode】33. 搜索旋轉排序數組(Search in Rotated Sorted Array)

Leetcode - 33 Search in Rotated Sorted Array (Medium)

題目描述:給定一個旋轉的有序數組,例如有序數組 [0,1,2,4,5,6,7] 經一次旋轉後可得 [4,5,6,7,0,1,2] ,再給定一個 target 值,返回 target 值在數組中的下標,如果不在返回 -1,假設數組中無重複元素,時間複雜度要求爲 O(logn)。

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

解題思路:題目要求時間複雜度是 O(logn) ,那就告訴我們要用二分搜索了,但是二分搜索是基於有序序列的,但是給出的數組經過一次旋轉之後就不再是有序的了,這時就要添加額外的判斷條件。

public int search(int[] nums, int target) {
    if (nums == null || nums.length == 0) return -1;
    int lo = 0, hi = nums.length - 1;
    while (hi > lo) {
        int mid = (lo + hi) / 2;
        if (nums[mid] == target) {
            return mid;
        }
        // 一定有一邊是有序的
        if (nums[mid] >= nums[lo]) {
            // 如果不再有序的那一邊,就一定在另外一邊
            if (target >= nums[lo] && target < nums[mid]) {
                hi = mid - 1;
            } else {
                lo = mid + 1;
            }
        } else {
            if (target > nums[mid] && target <= nums[hi]) {
                lo = mid + 1;
            } else {
                hi = mid - 1;
            }
        }
    }
    return nums[lo] == target ? lo : -1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章