1. 程式人生 > >LeetCode010 : 盛最多水的容器

LeetCode010 : 盛最多水的容器

一、寫在前面

LeetCode 第九題刪除排序陣列中的重複項傳輸門:LeetCode009: 刪除排序陣列中的重複項
今天給大家分享的是LeetCode 陣列與字串 第十題:盛最多水的容器,為面試而生,期待你的加入。

二、今日題目

給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。
圖例
示例:

輸入: [1,8,6,2,5,4,8
,3,7] 輸出: 49

三、 分析

第一眼看到這個圖,我就覺得,這個題目應該很有意思,beautiful。
剛看完題目,第一想法是直接遍歷,求出每對值的構成的元素面積,然後取出最大值,O(n^2)的時間複雜度,想想都有些複雜,“傻”,於是放棄這樣思考,夾逼準則,上一個題目就有讀者提出來能不能用夾逼準則,我的回答是不能,這題,我們能,基本思路如下圖所示:
我的思想

四、解題

  • 我的方法:
    夾逼法,我們不止一次用到。
    時間複雜度控制再:O(n)
    空間複雜度:O(1)
    夾逼方法
  • 提交結果
    提交結果

測試資料:50組
執行時間:36-64ms
擊敗人百分比:15.52-95.79%

程式碼優化一下:
優化
在上面的優化中只是單純的縮減了程式碼的數量,這裡用到了一些Python的小知識,我目前也在鞏固Python基礎知識,感興趣可以點選這裡檢視。
在程式碼變簡潔的同時,我們由於呼叫Python的庫,簡便操作,使時間效率有所降低。

  • 提交結果
    提交結果

測試資料:50組
執行時間:48-88ms
擊敗人百分比:5.64-37.70%

五、疑惑

簡單介紹夾逼準則

和大家普及一個知識,夾逼定理英文原名Squeeze Theorem。也稱兩邊夾定理、夾逼準則、夾擠定理、挾擠定理、三明治定理,是判定極限存在的兩個準則之一,是函式極限的定理。

從上面可以看出,夾逼準則是數學裡的一個方法,所以演算法要好,腦袋靈活,數學是必不可少的,我們找最大值,最小值,其實就是一個找極值的過程,和一般我們初中高中接觸到的數學不同的是,這裡的資料是離散的,所以我們得定點分析。

夾逼準則定理

為了日後機器學習,深度學習,我們普及一下夾逼準則:
1.如果數列{Xn},{Yn}及{Zn}滿足下列條件:
(1)當n>N0時,其中N0∈N*,有Yn≤Xn≤Zn,
(2){Yn}、{Zn}有相同的極限a,設-∞<a<+∞;
則,數列{Xn}的極限存在,且當 n→+∞,limXn =a。

2.函式A>B,函式B>C,函式A的極限是X,函式C的極限也是X ,那麼函式B的極限就一定是X,這個就是夾逼定理。

夾逼準則應用

1.設{Xn},{Zn}為收斂數列,且:當n趨於無窮大時,數列{Xn},{Zn}的極限均為:a.
若存在N,使得當n>N時,都有Xn≤Yn≤Zn,則數列{Yn}收斂,且極限為a.
2.夾逼準則適用於求解無法直接用極限運演算法則求極限的函式極限,間接通過求得F(x)和G(x)的極限來確定f(x)的極限。

以上部分內容來自百度百科,苦海無涯,好好學習。

六、結語

堅持 and 努力 : 終有所獲。

歡迎大家關注微信公眾號:極簡XksA,獲取Python/Java/前端等學習資源!

極簡XksA