旋轉陣列中的最小數字(多種方法)
阿新 • • 發佈:2019-01-03
題目描述:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
第一種方法:時間複雜度為nlog(n) 先進行排序,然後取出排序陣列的第一個元素
程式碼如下:
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { sort(rotateArray.begin(),rotateArray.end()); return rotateArray[0]; } };
第二種方法:時間複雜度為O(n)最基本的陣列中查詢最小的一個值
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int min=rotateArray[0]; for(int i=1;i<rotateArray.size();i++) { if(rotateArray[i]<min) { min=rotateArray[i]; } } return min; } };
第三種方法:使用二分查詢方法(也屬於二分查詢的變種)時間複雜度為log(n)
class Solution { public: int shunxuchazhao(vector<int> rotateArray, int start, int end) { int ans = rotateArray[start]; for(int i = start + 1; i <= end ; i++){ if(rotateArray[i] < ans) ans = rotateArray[i]; } return ans; } int minNumberInRotateArray(vector<int> rotateArray) { int end = rotateArray.size() - 1; if(end < 0) return 0; int start = 0; int mid = start; while(rotateArray[start] >= rotateArray[end]){ if (start == end - 1) { mid = end; break; } mid = (start + end) / 2; if (rotateArray[start] == rotateArray[end] && rotateArray[start] == rotateArray[mid]) { return shunxuchazhao(rotateArray, start, end); } if (rotateArray[start] <= rotateArray[mid]) start = mid; else if(rotateArray[mid] <= rotateArray[end]) end = mid; } return rotateArray[mid]; } };