1. 程式人生 > >LeetCode Day27 Search in Rotated Sorted Array

LeetCode Day27 Search in Rotated Sorted Array

原二分查詢要求陣列已排序,這樣目標只需與中間元素比較就可判斷下一步需要去左半部分查詢還是右半部分查詢。現陣列經過了旋轉排序,若仍僅僅與中間元素比較無法判斷元素具體在哪個半區(左右兩邊元素都可能比中間元素大或小),所以要進行多次判斷。但是旋轉之後的順序也存在規律,可以發現,若中間元素比最右邊元素小,則右邊是排序的;若中間元素比最右邊元素大,則左半部分是排序的。也就是說,雖然整個陣列不是順序的,但我們能判斷一半是排序的。這樣目標可以很容易的判斷是否在這個區間內(只需與確定排序的那段首尾比較),若不在,則在未排序的那段裡。
所以,第一步,判斷左半邊有序還是與半邊有序
第二步,若判斷某半部分有序,則判斷待查元素是不是在該有序區間,若在,將區間改為該有序區間,若不在,則在另一半無序區間。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int right=nums.size()-1,left=0,mid;
        while(left<=right){
            mid=(left+right)/2;
            if(nums[mid]==target) return mid;
            else if(nums[mid]<nums[right]){
                if
(target<=nums[right] && nums[mid]<=target) left=mid+1; else right=mid-1; } else{ if(target<=nums[mid] && nums[left]<=target) right=mid-1; else left=mid+1; } } return -1; }
};