leetcode-Medium-第11期-陣列-Container With Most Water
給出一個數組,索引 代表x軸線座標,值代表Y軸座標,求陣列中兩個值在座標軸能包含的最大面積

螢幕快照 2019-03-05 下午10.10.57.png
上圖藍色面積就是下面input陣列在座標軸所能包含的最大面積:
8x7x(9-2)=49
Input: [1,8,6,2,5,4,8,3,7] Output: 49
- 簡單解法複雜度O(n^2)
var maxArea = function(arr){ const len = arr.length; let max = 0; for(let i = 0; i < len; i++){ for(let j = i + 1; j < len; j++){ const area = Math.min(arr[i],arr[j]) * (j-i) if(area > max){ max = area } } } return max }
-
高效解法,複雜度O(n)
思路分析
面積 = 底*高 = L*H 1 肯定需要兩個值,一個左邊一個右邊 2 先取首尾的值,因為他們的相距最遠L最長,然後高為短的那條(如果取長的,短的那條不夠無法形成閉合),這樣得到一個面積S 3 從兩邊往中間遍歷,看能不能取到更大的面積S,雖然從兩邊往中間靠,L會變短,但是H可能會取得更大呀 4 所以這個時候就要判斷左邊和右邊的那個值更小,就捨棄他,取捨棄他後向中間靠的下一個值 5 然後再次算面積,並進行判斷... 6 當左值和右值靠在一起時,遍歷結束
var max = function(arr){ let l = 0 let r = arr.length - 1; let max = 0; while (l < r) { max = Math.max(max, Math.min(arr[l], arr[r])* (r - l)); if (arr[l] < arr[r]) l++; else r--; } return max; }