原创 LeetCode - 374. Guess Number Higher or Lower

這道題目並沒有什麼特別可說的地方,看到題目的描述就可以明白這是一個需要使用Binary Search解決的問題,所以直接使用Binary Search即可,代碼如下: /* The guess API is defined in the

原创 LeetCode - 160. Intersection of Two Linked Lists

代碼如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *

原创 LeetCode - 199. Binary Tree Right Side View

題目要求寫出Binary Tree從右側看的情況,我們首先可以想到的是基於Level Order Traversal的方法,我們只需要將每一層最右側的節點加入結果中即可,這種思路的代碼如下: public class Solution{

原创 LeetCode - 169. Majority Element

這道題的目的是找到數組中出現次數大於一半的數字,一開始的想法是使用一個HashMap記錄各個數字出現的次數,然後從中找到出現次數大於nums.length / 2的數字,這種方法比較直接,但是使用了O(n)的額外空間,算不上是最好的方法。

原创 LeetCode - 71. Simplify Path

這道題和羅馬數字轉換一樣,題目的求解方法與背景聯繫地非常強。基本上的一些規則是,如果遇到.或者“”,就直接跳過;如果遇到..就將上面的一個路徑回退。所以根據上面的思想,我們首先用一個Stack存儲結果路徑中的元素,使用一個Set存儲..,

原创 LeetCode - 61. Rotate List

這道題目提供了一個很好的思路,在遇到Linked List的問題時,當看似需要我們移動很多node的時候,我們可以直接移動指向頭節點的指針,而不是一個一個地去移動node。另外這道題目還有一個隱藏的陷阱,就是題目中給出的k可能是大於Lin

原创 LeetCode - 113. Path Sum II

遞歸地向左子樹和右子樹尋找,並且在遞歸調用的時候要注意sum的變化,這個類型的題目以前做過很多個,比如Subsets, Subsets II, Combination Sum, Combination Sum II,這幾道題目一定要放在一

原创 LeetCode - 129. Sum Root to Leaf Numbers

遇到Binary Tree就要想到recursion, divide and conquer,而且這種用單個位的數字組成整個數字的問題也需要多注意一下。一開始的思路想歪了,想這是把所有的數字都算出來,然後再相加,陷入到一個圈子裏出不來,後

原创 LeetCode - 121. Best Time to Buy and Sell Stock

在從頭掃描數組的過程中,我們使用兩個變量maxCurr和maxSoFar分別存儲當前的差值和到目前爲止的最大差值,其中 maxCurr = Math.max(0, maxCurr += prices[i] - prices[i - 1])

原创 LeetCode - 122. Best Time to Buy and Sell Stock II

相比於上一道題目Best Time to Buy and Sell Stock,這道題目可以交易多次,那麼在從前向後掃描數組的過程中,只要後面一天的股票價格高於當今的股票價格,就進行股票的交易,相當於是使用了貪心的思想,代碼如下: pub

原创 LeetCode - 201. Bitwise AND of Numbers Range

首先我們要明白的一點是二進制表示的奇數和偶數的AND操作最後一位一定是0,而如果m < n的話那麼他們之間一定會有一個奇數,一個偶數,接下來分別把m和n向右移動一位,我們可以重複上面的操作直到m >= n。當m >= n的時候,m和n之間

原创 LeetCode - 205. Isomorphic Strings

這道題目的解法非常巧妙,在Java中使用char本身作爲數組的index,這樣行得通是因爲char的表示方法是ASCII,每一個char都會對應一個int,ASCII一共有256個,所以使用一個長度爲256的數組來作爲HashMap使用。

原创 LeetCode - 120. Triangle

題目中給出的三角形有一個樹狀的結構,這就可以讓我們想到使用遍歷之類的算法比如說DFS。但是如果我們忍者你分析一下的話,可以發現相鄰的結點總是分享同一條邊,也就是說,這道題目中存在重疊子問題(overlapping subproblems)

原创 LeetCode - 189. Rotate Array

題目中要求翻轉一個數組,注意題目給出的k可能大於數組的長度,所以首先要進行一個預處理,就是k = k % nums.length。解決了這個問題之後,我們可以來考慮翻轉的問題,仔細觀察後發現,可以用三次翻轉數組來解決問題:首先將整個數組反

原创 LeetCode - 179. Largest Number

這道題目的解答非常聰明而巧妙,我們先來看下面的一個例子: str1 = "338" str2 = "9" s1 = str1 + str2 = "3389" s2 = str2 + str1 = "9338" 明顯9338 > 3389,