尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Leecode#11之盛最多水的容器

Leecode#11之盛最多水的容器 题目给定一个长度为n的整数数组height。有n条垂线第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明你不能倾斜容器。示例 1输入[1,8,6,2,5,4,8,3,7]输出49解释图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下容器能够容纳水表示为蓝色部分的最大值为 49。示例 2输入height [1,1]输出1提示n height.length2 n 1050 height[i] 104Java语言class Solution { public int maxArea(int[] height) { int left 0, right height.length - 1; int maxArea 0; while (left right) { int area Math.min(height[left], height[right]) * (right - left); maxArea Math.max(maxArea, area); if (height[left] height[right]) { left; } else { right--; } } return maxArea; } }核心思路双指针对向收缩。容器的水量由短板高度 × 宽度决定。每次移动较矮的那一边尝试寻找更高的板来获得更大面积。逐行说明int left 0, right height.length - 1; int maxArea 0;left从最左开始right从最右开始初始宽度最大。maxArea记录最大水量。while (left right) {两个指针相遇时结束。int area Math.min(height[left], height[right]) * (right - left); maxArea Math.max(maxArea, area);计算当前面积短板高度 × 宽度。水量取决于较矮的那块板水会从矮板溢出。更新最大值。if (height[left] height[right]) { left; } else { right--; }关键一步移动较矮的那一边。因为如果移动较高的一边宽度变小了高度仍然受限于矮板面积一定变小。只有移动矮板才可能遇到更高的板让面积变大。示例演示height [1,8,6,2,5,4,8,3,7]轮次leftright高度宽度面积maxArea移动108min(1,7)1888左矮→left218min(8,7)774949右矮→right--317min(8,3)361849右矮→right--416min(8,8)854049相等→right--515min(8,4)441649右矮→right--..................49...最终返回49。时间复杂度 O(n)空间复杂度 O(1)。python语言class Solution(object): def maxArea(self, height): :type height: List[int] :rtype: int left, right 0, len(height) - 1 max_area 0 while left right: area min(height[left], height[right]) * (right - left) max_area max(max_area, area) if height[left] height[right]: left 1 else: right - 1 return max_area逻辑与 Java 版完全一致逐行说明left, right 0, len(height) - 1 max_area 0Python 可以一行同时赋值两个变量。left从最左开始right从最右开始max_area记录最大水量。while left right: area min(height[left], height[right]) * (right - left) max_area max(max_area, area)min()取短板高度乘以宽度得到面积。max()更新最大值。对应 Java 的Math.min()和Math.max()。if height[left] height[right]: left 1 else: right - 1移动较矮的那一边。对应 Java 的left/right--Python 用 1/- 1。return max_area返回最大水量。与 Java 版的关键区别特性JavaPython取最小值Math.min(a, b)min(a, b)取最大值Math.max(a, b)max(a, b)数组长度height.lengthlen(height)自增/自减left/right--left 1/right - 1双变量赋值int a 0, b 1;a, b 0, 1时间复杂度 O(n)空间复杂度 O(1)。
返回列表