Leetcode刷題筆記3

開始刷leetcode一些中等的題目,主要都是刷Top 100的題目。

Daily Temperatures

給定一個溫度數組,計算經過幾天可以回暖,若不可能則 以0表示。

解法

透過堆疊保存先前狀態的特性,找到比目前溫度還要大的數值。 由後往前找尋資料,堆疊回溯直到空或頂端大於當前溫度, 計算差異,再把當前的值放入堆疊。

Permutations

給定一個數組產生所有組合。

解法

很明顯的遞迴題目,也可以透過堆疊迭代, 採用遞迴並標記已選取的數值。

Intersection of Two Linked Lists

尋找兩個連結串列的相交節點,若不相交則回傳null

解法

可以很容易透過hashtable實現,將其中一個連結串列全部放入 hashtable之後,遍歷另外一個串列並尋找,交點為第一次遍歷存在的點。

雙指標的解法經過兩次(兩者一樣長只須一次)可以得到相交點,讓指標從兩邊出發,到末端之後 指向另一個指標開頭,走訪到相同的點為交點。 判斷兩者是不是接上同一連結串列,表示兩者會匯聚到同一個連結串列, 在null之前所遇到的節點必須相同。

Rotate Image

給定一個n*n二維陣列,順時鐘旋轉90度,並且不能宣告格外的矩陣。

解法

透過螺旋以中心旋轉解決,外迴圈處理直徑,內迴圈處理邊長, 每次旋轉四個數值,內迴圈必須隨則外迴圈縮減,避免重複旋轉。

Find the Duplicate Number

給定一個陣列(大小為n+1)僅有一個數值重複,並且 數值小於陣列大小(1~n),找出重複的數值。

解法

可以將此陣列視為連結串列,重複的數值可以當成連結串列迴圈指向的地方 ,並且透過floyd's cycle detection下去找到重複的數字。 此算法需要快慢指標,並且找出環的進入點,交叉之後將其中一個指標 設為開頭,並且都以速度一行走,此交會點則為進入點。


LeetCode Stack Recursion Two Pointers Linked list