CookieCutter Web界面:图形化模板管理的终极解决方案
2026/5/6 23:23:24
题目链接:
盛最多水的容器
示例1:
这个是最简单的方法,但是会超时
把所有的情况都算一遍,不断更新最大面积,循环结束,保留的结果就是最大面积
i为左板,j为右板,且j > i);容积 = 宽度 × 短板高度,其中宽度是j - i,高度是Math.min(height[i], height[j]);O(n²)(双重循环遍历数组,n为数组长度),当n较大时会超时(例如 LeetCode 测试用例中n可达 10⁵,此时暴力解法会超出时间限制);O(1)(仅使用常量级额外空间)。public class Solution { public int maxArea(int[] height) { int maxVol = 0; int n = height.length; // 枚举所有可能的左指针i for (int i = 0; i < n; i++) { // 枚举所有可能的右指针j(j > i,避免重复计算) for (int j = i + 1; j < n; j++) { // 计算当前容器的宽度 int width = j - i; // 计算当前容器的高度(取两板中的短板) int h = Math.min(height[i], height[j]); // 计算当前容积 int vol = width * h; // 更新最大容积 if (vol > maxVol) { maxVol = vol; } } } return maxVol; } }双指针方法
针对 “盛最多水的容器” 问题,双指针法是效率最高的解法,核心思路是通过左右指针向中间收缩,每次移动较短的那一侧指针,从而逼近最大容积
left从数组开头出发,右指针right从数组末尾出发;宽度 × 短板高度);maxVol即为最大容积。[1,8,6,2,5,4,8,3,7])left=0(高度 1)、right=8(高度 7),容积8×1=8;left=1(高度 8),此时容积7×7=49(更新最大容积为 49);49(与示例输出一致)。O(n)(仅遍历数组一次);O(1)(仅使用常量级额外空间)。public class Solution { public int maxArea(int[] height) { int left = 0; // 左指针:初始指向数组左端 int right = height.length - 1; // 右指针:初始指向数组右端 int maxVol = 0; // 记录最大容积 while (left < right) { // 计算当前容器的宽度 int width = right - left; // 计算当前容器的高度(取左右指针中较短的板) int h = Math.min(height[left], height[right]); // 计算当前容积 int currentVol = width * h; // 更新最大容积 maxVol = Math.max(maxVol, currentVol); // 移动较短的那一侧指针(关键:缩短宽度的同时,尝试增加高度) if (height[left] < height[right]) { left++; } else { right--; } } return maxVol; } }