标签:高度 ... size repr div rms return form eth
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; } };
标签:高度 ... size repr div rms return form eth
原文地址:http://www.cnblogs.com/naivecoder/p/6964608.html