力扣 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輸出即可。

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