leetcode11. Container With Most Water兩根柱子圍成最大面積

牛客網第一課第三題
問題:給定一個非負數的數組,數組中的每個值代表一個柱子的高度,柱子的寬度是1。兩個柱子之間可以圍成一個面積,規定:面積=兩根柱子的最小值*兩根柱子之間的距離。
例子:數 組[3,4,2,5]。3和4之間圍成的面積爲0,因爲兩個柱子是相鄰的,中間沒有距離。3和 2之間圍成的面積爲2,因爲兩個柱子的距離爲1,且2是最短的柱子,所以面積=1*2。3和5之間圍成的面積爲6,因爲兩個柱子的距離爲2,且3是最短的柱子,所以面積= 3*2。求在一個數組中,哪兩個柱子圍成的面積最大,並返回值。
要求:實現時間複雜度O(N),額外空間複雜度O(1)
類似leetcode上的11題Container With Most Water,區別是leetcode11的兩個相鄰位置距離我們當成1處理。
解法1:這道題看起來難度不是很大,最樸素的想法就是對每一個位置遍歷一遍,計算這個位置到其他位置圍成的面積,保留最大的。這樣的時間複雜度爲O(N*N),額外空間複雜度O(1)。
解法2:這裏我們還是要玩雙指針,左指針L指向數組的第一個位置,右指針R指向數組的最後一個位置。取兩個位置值小的那一個,記爲T,T*(R-L-1)就是L和R圍成的面積。(這裏leetcode11題的計算方式爲T*(R-L))。然後,T的位置向中間滑動一個位置(L++或者R--),兩個指針相遇,算法結束,很明顯我們實現了時間複雜度O(N),額外空間複雜度O(1)。
public class LeetCode11 {
	public int maxArea(int[] height) {
		if (height == null || height.length < 3) {// leetcode11 這裏修改爲 height.length < 2
			return 0;
		}
		int l = 0;
		int r = height.length - 1;
		int area = Integer.MIN_VALUE;
		while (l <= r) {
			if(height[l] < height[r]){
				area = Math.max(area, height[l] * (r-l-1));
				// leetcode11 這裏修改爲 area = Math.max(area, height[l] * (r-l));
				l++;
			}else {
				area = Math.max(area, height[r] * (r-l-1));
				// leetcode11 這裏修改爲 area = Math.max(area, height[r] * (r-l));
				r--;
			}
		}
		return area;
	}
//	public static void main(String[] args) {
//		int[] a= {3,4,2,5};
//		int max = maxArea(a);
//		System.out.println(max);
//	}
}
代碼是針對本文的題目描述,如要提交的leetcode11題需要計算面積時修改一下,代碼中已經說明。

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