一些leetcode的easy
等級的解法。
樹
Path Sum
找到一個路徑由根到葉節點,並且和為給定的值判斷是否存在。
解法
透過dfs
到葉節點並且在過程加總數值,而dfs找到相等的地方則會返回真。
Range Sum Of BST
給予一個BST
與最大和最小值並且返回區間和。
解法
透過最大或最小值減少不必要的走訪,若介於這兩個值之間則算入加總,並返回加總。
Merge Two Binary Trees
給予兩顆樹並合併,若同一位置都存在新的節點則為兩者的和。
解法
只要兩個樹其中一個有子節點,就透過向下遞迴回傳加總過的節點, 或者複製其中一個節點的值,最後產生新的樹。
Symmetric Tree
給予一個樹,判斷是否鏡像。
解法
直接透過遞迴下去找查節點是否相等,不過兩邊遞迴的方向不同。 左樹往左同時右樹要往右,之後方向反過來在做一次。
Convert BST To Greater Tree
給一個二元樹並且讓每個數值加上大於所有本身的值。
解法
透過inorder
的方式,累加大於本身的值解決問題。
Invert Binary Tree
反轉二元樹。
解法
透過遞迴的方式實做,交換左右子樹。
雙指標
Remove Duplicates From Sorted Array
移除已排序陣列的當中重複的數值,並且返回新的陣列大小。
解法
透過讀頭寫頭,讀頭在讀到數值變化才會寫入到寫頭,在寫入後遞增寫頭, 最後寫頭的數值為處理過的陣列大小。
Move Zeroes
給定一個數組,把0
移到末端並且保持其他數值的順序。
解法
透過讀頭
與寫頭
,讀頭讀到非0值時會把數值寫
到寫頭並且兩者遞增,否則只遞增讀頭。若讀到末端之後,寫頭將
剩餘的空間全寫為0。
Linked List Cycle
判斷連結串列有無迴圈。
解法
透過快指標
與慢指標
兩種不同速度的指標,若連結串列含有迴圈,則兩指標最終會交疊。
其他
Min Stack
一個堆疊要能夠返回最小值以及最上層的數值。
解法
建立兩個堆疊分別保存最小值
與堆疊本體
,每次放入數值得時候
會比較堆疊頂端是否有新的最小值,若有則保存在最小值堆疊
當中。
Valid Parentheses
驗證輸入的字串的括號成對是否正確。
解法
透過堆疊下去檢查,遇到左半部則放進堆疊,右半部則移出堆疊並檢查類型是否相等, 若不相等則報錯,最後記得檢查堆疊是否為空,避免全部都是左半部的輸入。
Merge Two Sorted Lists
合併兩個已排序連結串列。
解法
新增一個節點把最小的值複製到當中,並串成新的連結串列,並且需要
注意在末端接上NULL
。
Robot Return to Origin
輸入一串移動的順序,並且判斷是否回到原點。
解法
將移動順序轉成x
與y
座標上的變化,並在最後判斷是不是在原點。
Reverse Linked List
反轉連結串列。
解法
透過遞迴找到連結串列的末端並返回該值,並且作為新的連結串列起點,
在返回的同時將上一個節點串接到新的新的連結串列之後,最後記得在末端補上NULL
,
得到反轉連結串列。
Single Number
給一個陣列找出只出現單次的數字,並且其他的數字都會出現兩次。
解法
透過xor
運算子可以消去出現兩次的bit,全部疊加之後只
保留出現單次的數字。
N Th Tribonacci Number
計算費波那契數列。
解法
透過遞迴計算結果,並且透過動態規劃加快速度。
Binary Search
二分搜一個以排序陣列回傳索引。
解法
二分搜演算法,採用迭代判斷三種情況慢慢縮減範圍,直到找到結果或找不到。
LeetCode Stack Tree Recursion Bit Manipulation Two Pointers Merge Linked list Dynamic programming