题目
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
思路
暴力解法(TLE)
利用两个for循环,遍历所有可能的情况,输出最大容量。
int maxArea(vector<int>& height) {
int i, j;
int maxans = 0;
for (i = 0; i < height.size(); i++) {
for (j = i + 1; j < height.size(); j++) {
int temp = 0;
if (height[j] >= height[i]) {
temp = height[i] * (j - i);
}else{
temp = height[j] * (j - i);
}
if (temp > maxans) {
maxans = temp;
//cout << maxans<<" "<<i<<" "<<j << endl;
}
}
}
return maxans;
}
当然,该算法可进行改进,比如不需要遍历所有情况,有些情况不用计算就可以排除,试图减少计算和比较来达到要求。
双指针法
int maxArea2(vector<int>& height) {
int left = 0, right = height.size() - 1;
int maxans = 0,temp=0;
while (left < right) {
temp = min(height[left], height[right]) * (right - left);
if (temp > maxans) {
maxans = temp;
}
if (height[left] > height[right]) {
right -= 1;
}
else {
left += 1;
}
}
return maxans;
}
该方法利用left和right两个指针指向容器的最左边和最右边,计算当前可容纳的水量,并且将left和right指针所指的较小的那个进行右移(左移),可得到最终的正确答案,当然该算法的正确性需要进行验证说明