LeetCode 33. Search in Rotated Sorted Array

Description: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

解題思路:題目的大概意思是,一個遞增序列(不含重複數據)切成2半,前一半放到後面去組成新的序列,該序列有個特點,只有在分界點上遞減,其他都是遞增的。現在給定一個目標,找出該目標所在的位置,找不到返回-1。因爲要求時間複雜度爲O(log n),所有得使用二分法,當前數組可以使用二分法。如果mid的數據等於target,則立即返回mid。如果left到mid的數據是連續遞增的,並且target在這個範圍內,則在該範圍內繼續使用二分法,如果不在該範圍內,則在mid到right使用二分法。如果left到mid數據不是連續遞增的,說明在mid到right是連續遞增的,如果target在mid到right範圍內,則繼續使用二分法,否則,在left到mid的範圍內使用二分法。最後都找不到的話,返回-1。

參考代碼:

int bin_search(int left, int right, vector<int> nums, int target) {
    //遞歸用if
    while (left <= right) {
        int mid = (left + right) / 2;
        if (target == nums[mid])
            return mid;
        if (nums[mid] >= nums[left] && target >= nums[left] && target < nums[mid]) {
            //return bin_search(left, mid - 1, nums, target);
            right = mid - 1;
        }
        else if (nums[mid] >= nums[left] && (target <= nums[left] || (target > nums[mid]))) {
            //return bin_search(mid + 1, right, nums, target);
            left = mid + 1;
        }
        else if (nums[mid] <= nums[left] && (target > nums[mid]) && target <= nums[right]) {
            //return bin_search(mid + 1, right, nums, target);
            left = mid + 1;
        }
        else {
            //return bin_search(left, mid-1, nums, target);
            right = mid - 1;
        }
        
    }
    return -1;
}
int MySolution::search(vector<int>& nums, int target) {
    return bin_search(0, nums.size() - 1, nums, target);
}

總結:最後發現遞歸和循環效率相差很大,這裏給出測試結果
使用循環二分查找:
Runtime: 4 ms, faster than 81.73% of C++ online submissions for Search in Rotated Sorted Array.
Memory Usage: 8.9 MB, less than 43.37% of C++ online submissions for Search in Rotated Sorted Array.

使用遞歸二分查找:
Runtime: 8 ms, faster than 15.65% of C++ online submissions for Search in Rotated Sorted Array.
Memory Usage: 10.7 MB, less than 6.03% of C++ online submissions for Search in Rotated Sorted Array.

發佈了65 篇原創文章 · 獲贊 75 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章