程式設計師公升級打怪第4關 怎樣盛最多的水?

2021-10-19 06:04:43 字數 1315 閱讀 8806

4 盛最多水的容器

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

示例 1:

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

輸出:49

解釋:圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

整體思路:這道題主要用到思路是:縮減搜尋空間

程式:

public

intmaxarea

(int

height)

else

}return res;

}

看了答案知道了演算法雙指標解法,總感覺怪怪的,為什麼指標直接向中間移動時,感覺漏掉了好多種情況?(不知道大家有沒有這種感覺,在有些情況的時候總感覺漏了一些什麼,但是結果是對的)。

原理:用一句話概括雙指標解法的要點:指標每一次移動,都意味著排除掉了乙個柱子。

如下圖所示,在一開始,我們考慮相距最遠的兩個柱子所能容納水的面積。水的寬度是兩根柱子之間的距離 d = 8;水的高度取決於兩根柱子之間較短的那個,即左邊柱子的高度 h = 3。水的面積為3×8=24。

如果選擇固定一根柱子,另外一根變化,水的面積會有什麼變化嗎?思考一下:

a當前柱子是最兩側的柱子,水的寬度 d 為最大,其他的組合,水的寬度都比這個小。

b左邊柱子較短,決定了水的高度為 3。如果移動左邊的柱子,新的水面高度不確定,一定不會超過右邊的柱子高度 7。

c如果移動右邊的柱子,新的水面高度一定不會超過左邊的柱子高度 3,也就是不會超過現在的水面高度。

所以,如果固定左邊的柱子,移動右邊的柱子,那麼水的高度一定不會增加,且寬度一定減少,所以水的面積一定減少。這個時候,左邊的柱子和任意乙個其他柱子的組合,其實都可以排除了。也就是我們可以排除掉左邊的柱子了。

這個排除掉左邊柱子的操作,就是雙指標**裡的 i++。i 和 j 兩個指標中間的區域都是還未排除掉的區域。隨著不斷的排除,i 和 j 都會往中間移動。當 i 和 j 相遇,演算法就結束了。

資料說話 怎樣的程式設計師最搶手?

我們分為兩點 首先,我們來看影響程式設計師漲薪的因素。1.1 什麼樣的程式設計師漲薪最多?安卓 ios web前端薪資漲幅都較其他語言要高。對單個程式設計師來說,想要獲得較高的薪資漲幅,選定熱門的語言與工作地是成功的基石。其他結論在9月程式設計師跳槽指南中有提及就不過度敘述了。1.2 什麼樣的程式設...

大資料說話 怎樣的程式設計師最搶手?

本文所有的資料 於100offer 10月參與拍賣的 200 名優秀的程式設計師收到的 1244 份面試邀請。一 什麼樣的程式設計師最受公司青睞?我們分為兩點 首先,我們來看影響程式設計師獲得面試邀請數的因素。1 什麼樣的程式設計師能獲得最多的面試邀請?最直接相關的兩個因素是 使用的程式語言與工作的...

Git學習筆記4 找出最懶的程式設計師

場景假設 乙個開發小組有10個程式設計師,他們用 git 做版本控制,某一天程式設計師a push了當天的幾個commit之後,突然在想 我在這個專案到底一共進行過多少次commit?誰比我commit更多?多多少?誰是組裡面進行最多commit的?誰是最少的?git 非常人性化地支援這樣乙個命令 ...