盛最多水的容器(Python and C++解法)

题目:

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water

思路:

  最优的做法是双指针,但需要知道一个前提(原因需要数学证明): 对应的数字较小的那个指针需要往另一个指针的方向移动一个位置,且这个指针不可能再作为最大容器的边界了。

Python解法:

 1 class Solution:
 2     def maxArea(self, height: List[int]) -> int:
 3         left = 0  # 左指针
 4         right = len(height) - 1  # 右指针 
 5         res = []
 6         while left < right:
 7             temp = min(height[left], height[right]) * (right - left)
 8             res.append(temp)
 9             if height[left] <= height[right]:
10                 left += 1
11             else:
12                 right -= 1
13         return max(res)

C++解法:

 1 class Solution {
 2 public:
 3     int maxArea(vector<int>& height) {
 4         int left = 0, right = height.size()-1;  // 左右指针
 5         vector<int> tempRes;
 6         while(left < right) {
 7             int temp = min(height[left], height[right]) * (right - left);  // 计算面积
 8             tempRes.push_back(temp);
 9             if(height[left] <= height[right])
10                 left++;
11             else
12                 right--;
13         }
14         return *max_element(tempRes.begin(), tempRes.end());  // 找vector最大值并返回
15     }
16 };
posted @ 2020-08-17 19:32  孔子?孟子?小柱子!  阅读(214)  评论(0编辑  收藏  举报