Leetcode C++《热题 Hot 100-25》11.盛最多水的容器
切忌急躁,理解至上;循序渐进,接近最优
- 题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中(要图是没有的,你可以去引用里面的原链接看)垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路
- 方案1:时间复杂度n*n,空间复杂度O(1)。这个题目蛮有意思,转换成数学要求就是找两个i和j,使得(j-i)*min(height[j],height[i])最大,暴力循环
- 木桶理论,无意中聊天朋友分享的一个特别有趣的理论,如果长处集中且很长,那木桶斜过来也可以装好多水hh
- 方案2:时间复杂度O(n),空间复杂度O(1) 贪心法,控制矩形的两个边界
- 每次left和right不能都移动,要控制变量法
- 变化高度小的一段,因为变化之后,可能得到一个更大的maxArea
- 代码
class Solution {
public:
//昨晚晚睡一小时,困的不行,今早上又起不来,又没效率;关键时刻理智要控制住情感,12点必须睡
/*int maxArea(vector<int>& height) {
int maxRes = 0;
for (int i = 0; i < height.size(); i++) {
for (int j = i+1; j < height.size(); j++) {
if ((j-i)*min(height[j],height[i]) > maxRes) {
maxRes = (j-i)*min(height[j],height[i]);
}
}
}
return maxRes;
}*/
//有没有其他方案捏
//方案2:时间复杂度O(n),空间复杂度O(1) 贪心法,控制矩形的两个边界
int maxArea(vector<int>& height) {
int maxRes = 0;
int left = 0;
int right = height.size()-1;
while(left < right) {
maxRes = max(maxRes, (right-left)*min(height[right],height[left]));
if (height[left] > height[right]) {
right--;
} else {
left++;
}
}
return maxRes;
}
};