我最近碰到這個問題就來了:中n
兩個直方圖之間的最大水量是多少?
您將得到高度直方圖每個寬1。你必須選擇任意兩個柱狀圖等,如果它開始下雨,所有其他直方圖(除了你們兩個已選擇)被移除,那麼在兩個直方圖之間收集的水被最大化。
Input: 9 3 2 5 9 7 8 1 4 6 Output: 25
在第三個和最後一個直方圖之間。
這是Trapping rain water問題的一個變種。
我嘗試了兩種解決方案,但都具有N^2的最壞情況複雜度。我們如何進一步優化。
Sol1:每對的蠻力。
int maxWaterCollected(vector<int> hist, int n) { int ans = 0; for (int i= 0; i < n; i++) { for (int j = i + 1; j < n; j++) { ans = max(ans, min(hist[i], hist[j]) * (j - i - 1)); } } return ans; }
Sol2:保持一系列直方圖的高度順序。對於每個直方圖,在這個序列中找到最佳的直方圖。現在,如果所有的直方圖都是遞增的,那麼這個解決方案也會變成N^2。
int maxWaterCollected(vector<int> hist, int n) { vector< pair<int, int> > increasingSeq(1, make_pair(hist[0], 0)); // initialised with 1st element. int ans = 0; for (int i = 1; i < n; i++) { // compute best result from current increasing sequence for (int j = 0; j < increasingSeq.size(); j++) { ans = max(ans, min(hist[i], increasingSeq[j].first) * (i - increasingSeq[j].second - 1)); } // add this histogram to sequence if (hist[i] > increasingSeq.back().first) { increasingSeq.push_back(make_pair(hist[i], i)); } } return ans; }
我已經提到過我的兩個方法,第一個是蠻力另一個是保持直方圖的遞增子的,但我覺得這個問題可以在更好的時間複雜度來解決。 –
[C++]觀衆傾向於將這些問題降低爲「缺乏努力」。 –
我在這裏沒有看到任何努力。 「我嘗試了兩種解決方案」,但沒有發佈任何代碼?請,如果你嘗試,**添加你所做的代碼**。 – tadman