力扣 题目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; }