1. 程式人生 > 其它 >力扣 題目11- 盛最多水的容器

力扣 題目11- 盛最多水的容器

題目


題解


 

這題一看 好!直接把所有情況遍歷一下 暴力破解 結束了.唉?不對不對力扣肯定會出一堆數。

事實果然如此

 

我去這那隻要是雙遍歷就不行了唄,那我們只能換一種思路了,

首先看這個圖 這個水槽邊界肯定是一左一右 那麼我們先把最左和最右設上木板 這時記錄一下面積

然後我們肯定要移動這個木板,但是怎麼移是問題了 仔細想一下就知道

高的肯定不能移 因為高的可能和其他比他矮木板的組成水槽 所以當誰矮的時候就向中間進一步 當木板重疊時結束迴圈

然後在這個過程中我們記錄一下最大面積的那個數 輸出即可

 程式碼


暴力解法:(力扣過不了)

#include <iostream>
#include
<vector> using namespace std; class Solution { public: int maxArea(vector<int>& height) { vector<int> kuang; bool first = false; int first2 = 0; int width = 0; int max = 0; int max2 = 0; for (int i = 0; i < height.size(); i++) {
if (max2 < height[i]) { max2 = height[i]; } } for (int i = max2; i >0; i--) { width = 0; first2 = -1; first = false; for (int j = 0; j < height.size(); j++) { if (height[j] >= i) {
if (!first) { first2 = j; first = true; } else { width = j - first2; } } } if (max < width * i) { max = width * i; } } return max; } }; int main() { vector<int> height = {2,3,10,5,7,8,9}; Solution sol; int max=sol.maxArea(height); cout << max << endl; }

真正解法:

#include <iostream>
#include<vector>
using namespace std;
class Solution {
public:
    int maxArea(vector<int>& height) {
        int play = 0;
        int end = height.size()-1;
        int max=0;
        for (; play != end;) {
            int measure = (end-play) * min(height[end], height[play]);
            if (max < measure) {
                max = measure;
            }
            if (height[play] <= height[end]) {
                play = play + 1;
            }
            else {
                end = end - 1;
            }
        }
        return max;
    }
};
int main() {
    vector<int> height = { 1,1};
    Solution sol;
    int max=sol.maxArea(height);
    cout << max << endl;

}