11.Container With Most Water
给定一个数组,数组中的数字在坐标系中按柱状图分布,选取两根柱子,与横坐标形成水池,求最大的水池面积。
Input: [1,8,6,2,5,4,8,3,7]
Output: 49
思路:
一开始运用暴力结题,O( n*n )的时间复杂度,然而不AC。
看了答案,运用两个下标 left = 0, right = n-1 ,每次移动 left和right中值最小的那一个,因为木桶原理,木桶的容量取决于最短的那块木板,只有把短板补长,才能使木桶容量更大。每一次移动得到的面积都要和已有的面积比较,若新的更大,则更新之前的。这样,能在线性复杂度下AC。
int maxArea(vector<int>& height) { int n = height.size(), res = 0, l = 0, r = n - 1; while (l < r) { int min = height[l] > height[r] ? height[r] : height[l]; int area = min * (r - l); res = area > res ? area : res; if (height[l] > height[r]) r--; else l++; } return res; }