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.
Subscribe to see which companies asked this question.
1
算法思想,计算每个面积求出最大值
class Solution {
public:
int maxArea(vector<int>& height) {
int areaMax=-1;
for(int i=0;i<height.size()-1;i++){
for(int j=i+1;j<height.size();j++){
areaMax=max(areaMax,min(height[i],height[j])*(j-i));
}
}
return areaMax;
}
};
在大数据情况下超时
2 改进算法思想
现假定取得最大面积的坐标为(i,height[i])(j,height[j]),其中i<j,
则areaMax=max(areaMax,min(height[i],height[j])*(j-i)),由此可推知在j的右端没有一条线比它高,设k>j,且height[k]>height[j],min(height[i],height[k])=
min(height[i],height[j]),则areaMax'=
max(areaMax,min(height[i],height[j])*(k-i))>areaMax,与原假设矛盾。
同理可知,i的左端没有一条线比它低
#include <iostream>
#include <vector>
#include "math.h"
using namespace std;
class Solution {
public:
int maxArea(vector<int>& height) {
int areaMax=-1;
int i=0,j=height.size()-1;
// for(int i=0;i<height.size()-1;i++){
// for(int j=i+1;j<height.size();j++){
// areaMax=max(areaMax,min(height[i],height[j])*(j-i));
// }
// }
while(i<j){
areaMax=max(areaMax,min(height[i],height[j])*(j-i));
if(height[i]>height[j]){
j--;
}else{
i++;
}
}
return areaMax;
}
};
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(1);
Solution sol;
int result=sol.maxArea(v);
cout<<result;
return 0;
}
本文探讨了给定一系列垂直线如何找出两个线段形成能容纳最多水的容器的算法问题。初始算法通过穷举所有组合来寻找最大值,但这种方法在大数据集下效率低下。为此,提出了一种优化方案,通过双指针技术逐步缩小搜索范围,显著提高了算法的性能。
232

被折叠的 条评论
为什么被折叠?



