Hexo + GitHub 部落格從 Windows 遷移到 macOS
一、實踐題目名稱
maximum number in a unimodal array
二、問題描述
You are a given a unimodal array of n distinct elements, meaning that its entries are in increasing order up until its maximum element, after which its elements are in decreasing order. Give an algorithm to compute the maximum element that runs in O(log n) time.
輸入格式:
An integer n in the first line, 1<= n <= 10000. N integers in the seconde line seperated by a space, which is a unimodal array.
輸出格式:
A integer which is the maximum integer in the array
輸入樣例:
7
1 2 3 9 8 6 5
結尾無空行
輸出樣例:
9
結尾無空行
三、演算法描述
#include<iostream> using namespace std;const int MAXN = 10010; int find(int* a, int l, int r) { if (l == r) return a[l]; int mid = (l + r) / 2; if (a[mid] > a[mid + 1]) return find(a, l, mid); else return find(a, mid + 1, r); } int main() { int n; cin>> n; int a[n];for (int i = 0; i< n; i++) { cin>> a[i]; } cout<<find(a, 0, n - 1); return 0; }
可以將陣列分為單增和單減兩部分,峰值為陣列的最大值。使用二分搜尋法進行查詢。
若a[mid] > a[mid + 1] ,說明最大值(峰值)在其左側;
反之,說明最大值(峰值)在其右側;
當a[mid] > a[mid - 1] &&a[mid] > a[mid + 1] 時,a[mid]即為陣列的最大值,查詢成功。
四、演算法時間及空間複雜度分析
時間複雜度:因為使用二分搜尋法,子問題規模為原問題規模的一半,取mid值的時間複雜度均為O(1),所以T(n) = T (n/2) + O(1) = O(log n)
空間複雜度:因為沒有藉助輔助陣列,與問題規模n大小無關,所以空間複雜度為O(1)
五、心得體會
這次上機實驗課,兩兩為一組。要讓搭檔瞭解自己的做題方法。這個上課的形式不僅讓我們學多一種解題方法,還能在給搭檔解釋自己的方法的時候鞏固關於分治法的知識點,因為當能給別人講懂一道題時,說明自己已經真正懂了。希望接下去繼續用這種方法和搭檔共同進步。
六、分治法的個人體會和思考
分治法就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。使用過該方法有時有效能縮短演算法的時間複雜度,提高效率。今後在編寫程式碼的時候,可以考慮是否使用分治法來解題。