Michael

LeetCode系列文章

[LeetCode] #110 Balanced Binary Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹是不是高度平衡,也就是左節點的深度與右節點點的深度相差不超過 1 解題思路 這題看是要寫個遞迴還是使用 Stack 搭配迴圈都可以 一開始做這一題時搞錯題意,原本以為只要從根節點算左右深度相減不超過 1 就好 結果是每一個節點左右都要平衡 Orz 程式碼 Java class Solution { public boolean isBalanced(TreeNode root) { if (root == null) { return true; } if (Math.abs(isBalanced(root.left, 1) - isBalanced(root.right, 1)) > 1) { return false; } return isBalance

By Michael

LeetCode系列文章

[LeetCode] #108 Convert Sorted Array to Binary Search Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個排序好的陣列 nums 回傳一顆平衡的二元搜尋樹,左右兩邊的層級不能超過 1 解題思路 二元搜尋樹有幾個特性 1. 不會有重複的值 2. 左節點數值一定比根節點數值小 3. 右節點數值一定比根節點數值大 4. 其他層的節點也要符合以上要求 既然所有的右邊節點一定比根節點大,所有左邊節點一定比根節點小,題目也規定兩邊的層數不能相差超過 1 那麼根節點只能選 nums 的中間值,這邊有個小疑問「如果 nums 是偶數呢?」,是要選左邊那個還是右邊那個? 答案其實無所謂,因為題目有提示說答案不止一種 根節點選擇好了後就能把 nums 拆成左右兩部分,左右兩部分也需要符合 二元搜尋樹 的特性 那一樣選擇中間值拆左右兩部分,所以分析後最適合的解法就是二分搜尋法了 程式碼 Java class Solution { public TreeNode sortedArrayToBST(int[] nums)

By Michael

LeetCode系列文章

[LeetCode] #139 Word Break 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個字串 s 和 字串 list wordDict 回傳能不能利用 wordDict 內的值組合出 s 範例: s = "applepenapple", wordDict = ["apple", "pen"],則回傳 true s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"],則回傳 false 解題思路 - 遞迴暴力法 這種方法簡單來說就是從頭開始切字串,如果切到存在於 wordDict 的字串時 就把剩餘字串進行下一次遞迴,直到所有狀態都走過一次或找到解答為止 執行結果: Time Limit Exceeded 程式碼 Java class Solution { public

By Michael

LeetCode系列文章

[LeetCode] #107 Binary Tree Level Order Traversal II 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 將這顆樹每一層的節點收集後回傳 解題思路 這題也是沒什麼難點,看是要用遞迴還是迴圈都可以解題 LeetCode 上有很多的題目都跟樹有關的,基本歷遍樹的方法掌握之後,解題上都不會太困難 程式碼 Java class Solution { public List> levelOrderBottom(TreeNode root) { List> result = new ArrayList<>(); levelOrderBottom(root, 1, result); Collections.reverse(result); return result; } public void levelOrderBottom(TreeNode root, int nowLevel, List

By Michael

LeetCode系列文章

[LeetCode] #104 Maximum Depth of Binary Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹最深的節點是第幾層 解題思路 這題基本上就是用遞迴去濾到最後深的一個節點,雖然說使用迴圈也可以做到 但就必須多寫一點程式碼,底下也會提供迴圈的版本 講回到遞迴,都必須搭配一個數字來計算第幾層 有從第一層加下去的,也有從最後一層加上來的 兩種版本也會附上 程式碼 Java class Solution { // 從第一層加下去 public int maxDepth(TreeNode root) { return maxDepth(root, 1); } private int maxDepth(TreeNode root, int nowLevel) { if (root == null) { return nowLevel -1; } return Math.max(maxDept

By Michael

LeetCode系列文章

[LeetCode] #101 Symmetric Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹是不是左右對稱的 解題思路 這題跟上一題 [LeetCode] #100 Same Tree 解題 是高度相像的 唯一的差異是因為要確認是否對稱,所以是左邊跟右邊比,右邊跟左邊比,中間一樣跟中間比 其中一個沒比對上就回傳 false 程式碼 Java class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) { return true; } return isSymmetric(root.left, root.right); } public boolean isSymmetric(TreeNode p, TreeNode q) { if (p

By Michael

LeetCode系列文章

[LeetCode] #100 Same Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個二元樹 p 和 q 回傳這兩棵樹是不是完全一樣 解題思路 這題看是要寫個遞迴還是使用 Stack 搭配迴圈都可以 沒有什麼困難點,就是左邊跟左邊比,右邊跟右邊比,中間跟中間比 其中一個沒比對上就回傳 false 程式碼 Java class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } else if (p == null || q == null || p.val != q.val) { return false; } return

By Michael

LeetCode系列文章

[LeetCode] #88 Merge Sorted Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個已排序的整數陣列 nums1 nums2 及它們各自的長度 m 與 n 將 nums2 的元素合併到 nums1 後進行排序即可 另 nums1 有保留給 nums2 的欄位,所以不需要另外產生新的陣列 範例: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3,則回傳 [1,2,2,3,5,6] m 為 nums1 的元素數量,n

By Michael

LeetCode系列文章

[LeetCode] #83 Remove Duplicates from Sorted List 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個已經排序好的 Linked List head,當中每一個元素都有一個數字 將這個所有的重複數字移除後回傳 範例: head = 1->1->2,則回傳 1->2 head = 1->1->2->3->3,則回傳 1->2->3 解題思路 這一題沒有太多好講的部分,就是利用迴圈或是遞迴的方式來把重複的數字過濾掉 如果是利用迴圈的方式,得要建立兩個參考物件 一個用來參考到最後一個元素,另一個用來歷遍所有元素 另一個遞迴解法是其他人提交的內容,寫遞迴挺燒腦的,所以就直接拿其他人的來用 很巧妙,只有三行 程式碼 Java class Solution { public ListNode deleteDuplicates(ListNode head) { if

By Michael

LeetCode系列文章

[LeetCode] #70 Climbing Stairs 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 n,這個 n 代表的階梯的數量 如果一次只能走 1 個階梯或 2 個階梯,回傳要到達第 n 個階梯有幾種走法 範例: n = 1,則回傳 1,因為只有一個階梯,也只能選擇走 1 個階梯 n = 2,則回傳 2,因為可以選擇走兩次 1 個階梯或是一次走 2 個階梯 n = 3,則回傳 3,因為可以選擇 1. 走三次 1 個階梯 2. 第一次走 1 個階梯,第二次走 2

By Michael

LeetCode系列文章

[LeetCode]#35 Search Insert Position 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個排序好的整數陣列 nums 和一個目標數字 target 找出 target 在 nums 的索引返回,如果沒有找到,則返回插入的索引 範例: nums = [1,3,5,6], target = 5,則回傳 2 nums = [1,3,5,6], target = 2,則回傳 1,因為 2 不存在 nums 中,又因 2 小於 3,所以插入時會在 3 的位置,所以回傳 3 的索引 1

By Michael

LeetCode系列文章

[LeetCode] #69 Sqrt(x) 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 x 計算出最接近 x 平方根的整數答案後回傳 簡單說就是去掉小數點只回傳整數部分 範例: x = 8,則回傳 2,雖然 8 的平方根介於 2 和 3 之間,但題目只要我們取整數就好 解題思路 如果你有搜尋過這個題目的話,大概知道主要的解題方向就是二分搜尋法的變種 更厲害的就會用 牛頓迭代法 來求根,但那已經是數學領域的東西,我自己是怎麼都看不懂 後來就自己簡單的寫了一個類似 十分逼近法 的解法,一樣可以過關 一開始用一個比較大的區間計算,我是設定 100 利用迴圈每次加 100 後計算平方直到大於 x 再慢慢扣 1 直到小於等於 x 程式碼 Java class Solution

By Michael

LeetCode系列文章

[LeetCode] #67 Add Binary 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個字串 a 和 b,字串內容是二進制(只有 0 和 1) 將兩個字串的二進制內容相加後回傳 範例: a = "11", b = "1",則回傳 "100",因為 11 + 1 = 100 a = "1010", b = "1011",則回傳 "10101" 解題思路 跟之前的一些題目一樣,有字串解跟數字解兩種方式 字串解比較直覺,但效能較差一些,程式碼也會多一些 兩種解同樣都是從字串最後面往回歷遍,等同於加法方式,由右到左 程式碼 Java class Solution { public String addBinary(String a, String

By Michael

LeetCode系列文章

[LeetCode] #66 Plus One 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數陣列 digits 將這個陣列看作一串數字的組合,把數字 + 1 後回傳 範例: digits = [1,2,3],則回傳 [1,2,4],因為 123 + 1 = 124 解題思路 一開始走了彎路,寫了很多判斷和使用 List 來應付位數增加的情況 後來研究其他人的寫法後才恍然大悟,因為忽略了一個很簡單的事實 位數增加的情況就只會是 9、99、999、9999...等等 加上 1 後變成 10 100 1000 10000,也就只有這個情況位數才會增加 只要其中一位數不是 9 ,就可以直接回傳了 程式碼 Java class

By Michael

LeetCode系列文章

[LeetCode] #58 Length of Last Word 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串 s 字串中由一些空白字元當作間隔,請找出最後一個單詞後將長度回傳 s 中只會由空白及英文字母組成,如果不存在最後一個單詞就回傳 0 範例: s = "Hello World",則回傳 5 解題思路 這題需要從字串的尾部開始,宣告一個計數器後逐字元確認 如果遇到空白字元請計數器不為 0 ,則直接回傳 程式碼 Java class Solution { public int lengthOfLastWord(String s) { int result = 0; for (int i = s.length() -1; i > -1; i--) { if (s.charAt(i) == '

By Michael

LeetCode系列文章

[LeetCode] #38 Count and Say 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 n,將 n 計數轉換後回傳 一開始看到這一題無法第一時間理解意思 後來找了下中文翻譯後總算了解題目是想要說什麼 範例: n = 1,直接回傳 1 n = 2,需要回傳 11,因為 n = 1 時是回傳 1,所以用語言說的話就是 1 個 1 => 11 n = 3,需要回傳 21,因為 n = 2 的時候是 2 個 1 n = 4,需要回傳 1211,因為 n = 3 的時候是 1

By Michael