首页 > 代码库 > 11. Container With Most Water
11. Container With Most Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
对于两个坐标(i, ai)和(j, aj),它们之间形成的区域面积为min(ai, aj)*(j - i)。
蛮力算法的时间复杂度为O(n2),我们尝试着进行改进。
借鉴two pointers的做法:由于矩形区域的面积是长乘以高,将两个指针分别放在数组的首端和尾端,此时j - i的值最大。那么其他矩形的面积如果要超过这个矩形,就必须有高度超过该矩形的高度。
因此,我们可以尝试让两个指针不断地向中间靠拢,直至高度超过上一个矩形的高度,然后计算面积,进行比较。终止条件是两个指针相遇。
这种方法的时间复杂度是O(n)。
class Solution { public: int maxArea(vector<int>& height) { int n = height.size(); if (n < 2) return 0; int max_area = 0; for (int i = 0, j = n - 1; i < j; ) { int high = std::min(height[i], height[j]); int cur_area = high * (j - i); max_area = std::max(max_area, cur_area); while (i < j && height[i] <= high) ++i; while (i < j && height[j] <= high) --j; } return max_area; } };
11. Container With Most Water
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。