力扣 題目11- 盛最多水的容器
阿新 • • 發佈:2022-03-28
題解
這題一看 好!直接把所有情況遍歷一下 暴力破解 結束了.唉?不對不對力扣肯定會出一堆數。
事實果然如此
我去這那隻要是雙遍歷就不行了唄,那我們只能換一種思路了,
首先看這個圖 這個水槽邊界肯定是一左一右 那麼我們先把最左和最右設上木板 這時記錄一下面積
然後我們肯定要移動這個木板,但是怎麼移是問題了 仔細想一下就知道
高的肯定不能移 因為高的可能和其他比他矮木板的組成水槽 所以當誰矮的時候就向中間進一步 當木板重疊時結束迴圈
然後在這個過程中我們記錄一下最大面積的那個數 輸出即可
程式碼
暴力解法:(力扣過不了)
#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; }