一.暴力解法
二. 雙指標解法(最優解)
11. 盛最多水的容器
難度中等1679
給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
**說明:**你不能傾斜容器,且 n 的值至少為 2。
思路: 設定雙層迴圈,內層迴圈每次開始時,都比外層迴圈要 +1 這樣會減少一些重複的,其實也沒啥用,照樣時間複雜度太高,提交失敗,這裡只是提一下.本方法不可取,
class solution
}return ans;
}};
時間複雜度: 二層迴圈,在固定乙個外層迴圈i後,內層迴圈會執行n - i 次 i 是在陣列0的位置上開始變化的,所以i可以忽略不計,時間複雜度為o(n^2);
空間複雜度: 使用了常量的空間為o(1);
這個要考驗對題目的理解程度; 這個題解就相當不錯
如果選擇固定一根柱子,另外一根變化,水的面積會有什麼變化嗎?稍加思考可得:
當前柱子是最兩側的柱子,水的寬度 dd 為最大,其他的組合,水的寬度都比這個小。
左邊柱子較短,決定了水的高度為 3。如果移動左邊的柱子,新的水面高度不確定,一定不會超過右邊的柱子高度 7。
如果移動右邊的柱子,新的水面高度一定不會超過左邊的柱子高度 3,也就是不會超過現在的水面高度。
由此可見,如果固定左邊的柱子,移動右邊的柱子,那麼水的高度一定不會增加,且寬度一定減少,所以水的面積一定減少。這個時候,左邊的柱子和任意乙個其他柱子的組合,其實都可以排除了。也就是我們可以排除掉左邊的柱子了。
這個排除掉左邊柱子的操作,就是雙指標**裡的 i++。i 和 j 兩個指標中間的區域都是還未排除掉的區域。隨著不斷的排除,i 和 j 都會往中間移動。當 i 和 j 相遇,演算法就結束了
class solution else
ans = max(ans,area);
}return ans;
}};### 時空複雜度分析:
時間複雜度: 只需要遍歷一遍陣列就可以了,o(n);
空間複雜度: 使用了常量的空間為o(1);
Leetcode刷題 11 盛最多水的容器
示例解題思路 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。輸入 1,8,6,...
LeedCode刷題筆記 盛水最多的容器
給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器。示例 1 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存...
LeetCode刷題筆記 十一)盛最多水的容器
題目 給定 n 個非負整數 a 1,a2,a n,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。解法1 暴力class soluti...