力扣 11. 盛最多水的容器

题目:
给定 n 个非负整数 a1,a2,…,an,每个数代表座标中的一个点 (i, ai) 。在座标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

在这里插入图片描述

Java:
class Solution {
    
    public int maxArea(int[] height) {
    	int l=0;
		int r=height.length-1;
		int v;
		int maxv=0;
		while(l!=r){
		if(height[l]<height[r]){
			v=(r-l)*height[l];
			l++;
		}
		else{
			v=(r-l)*height[r];
			r--;
		}
		maxv=maxv>v?maxv:v;
	}
	return maxv;     
    }
}
c
int maxArea(int* height, int heightSize){//双指针法 
	int l=0;//左 
	int r=heightSize-1;//右 
	int v;//中间变量 
	int maxv=0;//最大 
	while(l!=r){
		if(height[l]<height[r]){
			v=(r-l)*height[l];
			l++;//如果上一句前面便跳过第一个(下:最后一个)节点 
		}
//		if(height[l]>height[r]){
//			v=(r-l)*height[r];
//			r--;
//		}(如果有if,则时间复杂度增加o(n),成为2o(n),else用来减少时间复杂度)
		else{
			v=(r-l)*height[r];
			r--;
		}
		maxv = maxv > v ? maxv : v ;
	}
	return maxv;
}

这个题用的双指针法。
想要得到盛最多水的容器,一方面要考虑他的宽度,一方面要考虑他的高度。
两方面都要考虑,所以可以先设定一个初值,max,来记录每次指针移动后的盛水的量,然后移动两端相比最小的那一边(已确保高度最大),直至遍历一遍(right==left),将得到的max输出即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章