题目描述
题目分析
看到题目后第一个想法当然是O(n2)O(n^2)O(n2)的,但是数据范围是3e4
,应该会超时,而且这种数据范围也不是让暴力求解的 。
相当于求解∑i<jmax((j−i)∗min(a[i],a[j]))\sum_{i<j}{max((j-i)*min(a[i],a[j]))}∑i<jmax((j−i)∗min(a[i],a[j]))。因为minminmin的缘故,所以我觉得不能进行区间合并。总之没有什么头绪。
看了题解以后发现这是一道数学题,策略: 初始时用两个指针一个指向左侧,一个指向右侧,每次记录当前容量,并将较小指针向较大指针移动。
证明:后附
class Solution {
public:int maxArea(vector<int>& height) {int n = height.size();int i = 0, j = n - 1;int ans = 0;while (i < j) {if (height[i] < height[j]) {ans = max(ans, height[i] * (j - i));++i;} else {ans = max(ans, height[j] * (j - i));--j;}}return ans;}
};