刚开始做这个题的时候,首先想到的是暴力解法,但是暴力解发写起来太没意思了,不但浪费体力,同时浪费时间,而后想到的是对容器左边高度和坐标进行标记,记录下可能作为容器左边高度的坐标和高度,我是这样想的,如果**j>i而且高度[j]同时大于高度[i]**时,就把这个数据塞进vector里面,然后进行对vector的循环,这样可以很大程度的减少循环量,但是奈何leetcode并不想让我们这么做。崩在了一组长度为15000公差为1的等差数列上,很尬。。。先看代码
class Solution11_error_time_limit {
public:
typedef pair<int, int> leftside; //first 为坐标 second为高度
int maxArea(vector<int>& height) {
vector<leftside> left_sides; //记录可能存在的左边高度
left_sides.push_back({ 0, height[0] });
int length_height = height.size();
int maxarea = 0;
for (int i = 1;i < length_height;i++)
{
for (int j = 0;j < left_sides.size();j++)
{
maxarea = max(maxarea, min(left_sides[j].second, height[i]) *(i - left_sides[j].first));
if ((i > j) && height[i] > left_sides[left_sides.size() - 1].second) //判定
{
left_sides.push_back({ i,height[i] });
}
}
}
return maxarea;
}
};
后来用的双指针内向搜索AC的,思路很简单,但是就是看能不能想到(可能是废话)…
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1, maxarea = 0;
int length_height = height.size();
while (left < right)
{
maxarea = max(maxarea, min(height[left], height[right])*(right - left));
if (height[left] > height[right]) right--;
else left++;
}
return maxarea;
}
};