题目链接:https://leetcode.cn/problems/container-with-most-water/
简单解法
- 双层循环,用每一个数分别和其他数据算出一组值
- 保留每个数据算出的该组值中的最大数
- 所有数据对应的最大数进行比较,选出最大的即为解
简单解法代码
class Solution {
public:
int maxArea(vector<int>& height) {
//双循环分别计算每组的乘积,用一个数组存储,数组大小为i,每组中用大的替换小的,之后将该数组大小进行比较 选出一个最大的
int num=height.size();
int result[num];
for(int i=0;i<num;i++){
result[i]=0;
}
int temp,sum,max;
for(int i=0;i<height.size();i++){
for(int j=i+1;j<height.size();j++){
temp=height[i]>height[j]?height[j]:height[i];
sum=temp*(j-i);
if(sum>result[i]){
result[i]=sum;
}
}
}
max=result[0];
for(int i=1;i<height.size();i++){
if(result[i]>max)
max=result[i];
}
return max;
}
};
简单解法结果
由于代码时间复杂度为O(n2),故遇到n比较大时会出现超时错误
算法改进-双指针实现
算法概述
- 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽底边宽度 −1变短:
- 若向内 移动短板 ,水槽的短板可能变大,因此下个水槽的面积可能增大 。
- 若向内 移动长板 ,水槽的短板不变或变小,因此下个水槽的面积一定变小 。
- 因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
算法参考:
作者:Krahets
链接:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码(原创):
class Solution {
public:
int maxArea(vector<int>& height) {
int front=0;
int rear=height.size()-1;
int result=0,max=0,temp;
while(front!=rear){
temp=height[front]<height[rear]?height[front]:height[rear];
result=temp*(rear-front);
if(result>max)
max=result;
//每次移动短的,才会出现更大的面积
if(height[front]<height[rear]){
front++;
}else{
rear--;
}
}
return max;
}
};