Leetcode 11-盛最多水的容器

📅 发布时间:2026/7/7 16:05:53 👁️ 浏览次数:
Leetcode 11-盛最多水的容器
看到题目第一步还是先尝试暴力破解即把每条垂线和其他每条垂线组成容器算容积最后return最大的容积。class Solution { public int maxArea(int[] height) { int volume 0; for(int i 0; iheight.length;i){ for(int j i1; jheight.length;j){ volume Math.max(volume, (j - i)*Math.min(height[i], height[j])); } } return volume; } }能通过大部分的case但是遇到数据又多数值又大的case会超时毕竟时间复杂度是O(n2)。同样是双指针的题目所以很容易就可以想到左右两边分别放一个指针然后一步步移动指针来计算以规避多余的计算。最开始的时候容器长度是最长的随着指针向内移动长只会越来越小因此想要找到更大的容器容器的宽度必须要比之前长。而容器的宽度取决于短边因此每次循环只需要移动短的那一边遇到更长的时候更新那条边的长度计算新的容积然后再与之前的取最大值就行了。当左右2边找不到更长的边之后停止循环。class Solution { public static int maxArea(int[] height) { int leftPin 0; int rightPin height.length-1; int leftLength height[leftPin]; int rightLength height[rightPin]; int volume (height.length-1)*Math.min(leftLength,rightLength); while(leftPinrightPin){ if(leftLength rightLength){ int nextPin; for(nextPin leftPin1; nextPinrightPin; nextPin){ if(leftLength height[nextPin]){ leftPin nextPin; leftLength height[leftPin]; break; } } if(nextPin rightPin){ return volume; } } else{ int nextPin; for(nextPin rightPin-1; nextPinleftPin; nextPin--){ if(rightLength height[nextPin]){ rightPin nextPin; rightLength height[rightPin]; break; } } if(nextPin leftPin){ return volume; } } volume Math.max(volume, (rightPin-leftPin)*Math.min(rightLength,leftLength)); } return volume; } }看了一下题解才发现写的有点繁琐了在移动一边的时候没必要遇到比原来长的垂线才更新完全可以每次移动一格然后直接比较这样可以少写一个for循环。class Solution { public static int maxArea(int[] height) { int leftPin 0; int rightPin height.length-1; int volume (height.length-1)*Math.min(height[leftPin],height[rightPin]); while(leftPinrightPin){ if(height[leftPin] height[rightPin]){ leftPin; } else{ rightPin--; } volume Math.max(volume, (rightPin-leftPin)*Math.min(height[leftPin],height[rightPin])); } return volume; } }代码简化了一些但是速度因为多计算了不必要的容积变慢了。这么看多声明几个变量以去除不必要的计算还是值得的。