leetcode 盛最多水的容器 中等

双指针,起初 l = 0, r = height.size() - 1,双指针的移动方案是:谁矮移动谁。
area = min(height[l], height[r]) * (r - l),其中 (r - l) 的值肯定是减少,要增加 area 只有一种方式 (只有一种!!),那就是移动 height[l] 与 height[r] 中小的那一个!!
虽然 area 有可能会更小,但是 答案是取 max,并不影响。。
当然,也有其他方案:对于一个板来说,假设它是高度的决定因素,那么只需要找到其右边最后一个大于等于它的数即可,左边同理!!
所以枚举每个数,假设它是高度的决定与因素就行了。右边最后一个大于等于它的数,可以用线段树搞定。时间复杂度 nlogn
class Solution { public: int maxArea(vector<int>& height) { int res = 0; for(int l = 0, r = height.size() - 1; l < r; ) { res = max(res, (r - l) * min(height[l], height[r])); height[l] < height[r] ? ++ l : -- r; } return res; } };

浙公网安备 33010602011771号