Leetcode數(shù)組Medium | 33. 搜索旋轉排序數(shù)組

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

( 例如,數(shù)組 [0,1,2,4,5,6,7] 可能變?yōu)?[4,5,6,7,0,1,2] )。

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

你可以假設數(shù)組中不存在重復的元素。

你的算法時間復雜度必須是 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

解答:
解題思路:

這道題讓在旋轉數(shù)組中搜索一個給定值,若存在返回坐標,若不存在返回-1。我們還是考慮二分搜索法,但是這道題的難點在于我們不知道原數(shù)組在哪旋轉了,我們還是用題目中給的例子來分析,對于數(shù)組[0 1 2 4 5 6 7] 共有下列七種旋轉方法:

0  1  2   4  5  6  7

7  0  1   2  4  5  6

6  7  0   1  2  4  5

5  6  7   0  1  2  4

4  5  6  7  0  1  2

2  4  5  6  7  0  1

1  2  4  5  6  7  0

二分搜索法的關鍵在于獲得了中間數(shù)后,判斷下面要搜索左半段還是右半段,我們觀察上面紅色加粗的數(shù)字都是升序的(前4行),由此我們可以觀察出規(guī)律,如果中間的數(shù)小于最右邊的數(shù),則右半段是有序的,若中間數(shù)大于最右邊數(shù),則左半段是有序的,我們只要在有序的半段里用首尾兩個數(shù)組來判斷目標值是否在這一區(qū)域內,這樣就可以確定保留哪半邊了。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size()<=0) //  數(shù)組為空
            return -1;
        int t1=0,t2=nums.size()-1;  //  雙動態(tài)指針
        while(t1<=t2){
            int mid=(t1+t2)/2;  //  中位數(shù)
            if(nums[mid]==target)  
                return mid;
            else if(nums[mid]<nums[t2]){
                if(nums[mid]<target && nums[t2]>=target)
                    t1=mid+1; //  之所以加一是因為中位數(shù)前面已經比較過了
                else
                    t2=mid-1;
            }  //  若中位數(shù)小于最右的數(shù),說明右半部分是有序的,先在右邊查找
            else{
                if(nums[t1]<=target && nums[mid]>target)
                    t2=mid-1;
                else
                    t1=mid+1;
            } //  否則,左半部分有序,先在左邊查找
        }
        return -1;  //  找不到,返回-1
    }
};

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 4,899評論 0 0
  • 假設按照升序排序的數(shù)組在預先未知的某個點上進行了旋轉。 ( 例如,數(shù)組 [0,1,2,4,5,6,7] 可能變?yōu)?...
    燭火的咆哮閱讀 355評論 0 0
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,369評論 2 36
  • 今天剛看完剩下的半本書,《你的生命有什么可能》,想要一個不同的未知的未來,就想在書里找看怎么樣讓生命有更多的可能:...
    Lee_太白閱讀 144評論 0 0
  • 親愛的弟弟: 我決定給你寫信,記下我要對你說的話。我覺得作為旁人,我不應該對你的人生有太多指畫,但是作為你的朋友...
    車馬正簡閱讀 1,227評論 0 0

友情鏈接更多精彩內容