開始刷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