leetcode33 搜索旋轉排序數組_C++_med

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。

( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。

搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設數組中不存在重複的元素。

你的算法時間複雜度必須是 O(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1

思路: 要求我們用logn級別的時間複雜度,幾乎就可以鎖定在二分法上了。那麼二分法的關鍵就是找到規律,在旋轉數組裏,中間量和左右量的關係如何確定大小。按照提示嘗試可知,如果中間量大於最右邊,那麼旋轉結點出現在中間量的右側,那麼判斷有序的一側(左側)是否存在目標值的可能,不能則搜索另一側。反之同樣的規律。

 

C++代碼如下:

class Solution {
   
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        if(n == 0) return -1;
        int left=0;
        int right=n-1;
        while(left <=right)
        {
            int med=(left+right)/2;
            if(nums[med] == target) return med;
            if(nums[med] > nums[right])
            {//左邊是有序的
                if(nums[med] > target && nums[left] <= target)
                {//在左邊
                    right = med-1;
                }
                else {
                    //在右邊
                    left = med+1;
                }
            }
            else {
                //右邊是有序的
                if(nums[med] < target && nums[right] >= target)
                {
                    left = med+1;
                }
                else{
                    right = med -1;
                }
            }
        }
        return -1;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章