算法题5:盛最多水的容器
题目描述:
给定一个长度为n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与
x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。

示例 2:
输入:height = [1,1] 输出:1提示:
n == height.length2 <= n <= 1050 <= height[i] <= 104
思路:
这题我开始的思路是两层for循环遍历所有的组合,提交后超时了,时间复杂度不合格,看了解题才搞清楚,可以采用双指针的方式从左右两边同时往里移动,计算面积,当左侧木板过度小于右侧木板高度时,左侧指针向右移动一次,反之则右侧指针向左右移动
在每个状态下,无论左侧或右侧指针向中间收缩一格,都会导致水槽底部宽度 减1 变短,那么两侧模板移动对面积的可能影响:
1、若向内移动短板,水槽的短板可能变大,那么下个水槽的面积可能变大
2、若向内移动长版,水槽的短板不变或变小,那么下个水槽的面积一定变小
因为每次箱内移动短板可能会获得更大的水槽面积,那么思路就是每次移动时取高度短的那个,直到两个指针相遇,获取所有面积组合的最大值即为答案
python:
class Solution: def maxArea(self, height: List[int]) -> int: # 面积为长度*两条线之间较短的height[i] max_value, left_num, right_num = 0, 0, len(height) - 1 while ( left_num < right_num): # 面积 area = (right_num - left_num) * min(height[left_num], height[right_num]) if area > max_value: max_value = area if height[left_num] > height[right_num]: right_num -= 1 else: left_num += 1 return max_value
结果:

java:
class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length - 1; int max_area = 0; while (left < right) { int area = (right - left) * Math.min(height[left], height[right]); max_area = Math.max(area, max_area); if (height[left] > height[right]) { right --; } else { left ++; } } return max_area; } }
结果


浙公网安备 33010602011771号