劍指offer-06 旋轉數組的最小數字

劍指offer-06 旋轉數組的最小數字

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

題目類別

解題思路

一開始的思路是從前向後比較,直到出現遞減。但是還可以用二分查找解決此類問題
取中間值,並設置兩端的index,中間值大於左邊的index,那麼就將左邊的index設置爲中間值,向遞增尾端移動,反之設置右邊的index,向遞減前端移動,最終兩個index相差爲1的時候,就找到了最小值,時間複雜度爲O(logn)
注意問題:
1 當數組旋轉0時,最左邊元素小於最右邊元素,這也就是indexMid最開始值爲index1
2.當左端值和中間值和右端值相等時。無法判斷數字是位於前面範圍還是後面範圍,因此退化爲O(n)複雜度算法

具體實現

class Solution {
public:
mberInRotateArray(vector<int> rotateArray) {
        int index1 = 0;
        int index2 = rotateArray.size()-1;
        int indexMid = index1;
        while(rotateArray[index1] >= rotateArray[index2]){
            indexMid = (index1+index2)/2;
            if(rotateArray[index1]== rotateArray[indexMid] && 
              rotateArray[index2]== rotateArray[indexMid] )
                return Min(rotateArray, index1, index2);
            if(index2-index1 == 1){
                indexMid = index2;
                break;
            }
            if(rotateArray[indexMid] >= rotateArray[index1])
                index1 = indexMid;
            else
                index2 = indexMid;
        }
        return rotateArray[indexMid];
        
    }
    int Min (vector<int> rotateArray,int l,int r){
        for( int i = l; i < r ; i++){
            if(rotateArray[i] > rotateArray[i+1])
                return rotateArray[i+1];
        }
    }
};
發佈了37 篇原創文章 · 獲贊 5 · 訪問量 8098
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章