1. 程式人生 > >leetcode題庫——搜尋旋轉排序陣列

leetcode題庫——搜尋旋轉排序陣列

題目描述:

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

( 例如,陣列 [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

方法:二分搜尋

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size()==0) return -1;
        int low,mid,high;
        low=0;high=nums.size()-1;
        
        while(low<high){
            mid=(low+high)/2;
            if(nums[mid]==target) return mid;
            if(nums[mid]>=nums[low]){//左邊半有序
                if(nums[mid]>target&&nums[low]<=target)//目標值在左邊
                    high=mid-1;
                else low=mid+1;
            }
            else{//右邊半有序
                if(nums[mid]<=target&&nums[high]>=target)//目標值在右邊
                    low=mid+1;
                else high=mid-1;
            }
        }
        if(low==high&&nums[low]==target) return low;
        return -1;
    }
};

思路:

題目要求複雜度為log(n),故最有可能的方法就是二分搜尋。但是由於給定的數字序列順序旋轉,所以在判斷時需要注意,mid左邊還是右邊是有序的,還要判斷目標值在左邊還是右邊。只有當目標值在有序的一邊,才可以用傳統的二分辦法,即中間值比目標值大,則high=mid-1,或中間值比目標值小,則low=mid+1。