原创 leetcode347——前K個高頻元素——java實現

題目要求: 分析: 這種題目又來了,根深蒂固的HashMap思想絕對是呼之欲出。於是不假思索,先用HashMap求出每個數字有幾個再說。 求出每個數字的頻率之後,我們想要求出第k高的頻率的元素,並且時間複雜度必須優於O(nlog

原创 leetcode337——打家劫舍III——java實現

題目要求: 分析: 這是一道樹形DP題,之前我說過,遇到樹的題目,就要想到用遞歸,這道題目也一樣,並且也要使用DP。 我們令dp來表示小偷偷的最多錢數,那麼他有兩種狀態,一種是偷了這個節點,另一種是沒有偷這個節點。 以根節點爲參

原创 leetcode338——比特位計數——java實現

題目要求: 分析: 一看到這種要變成二進制數的題目,就想到%2之類的運算,因爲%2相當於往右邊挪一位。但是我也不知道具體應該怎麼操作,只知道應該要用到這種步驟。 在這裏,我參照了leetcode上一位大神的做法。傳送門:清晰的思

原创 leetcode399——除法求值——java實現

題目要求: 分析: 剛開始看這道題目的時候真的是太噁心了,密密麻麻全是字,轉換一下,人家想讓我們求的東西就如下圖所示: 給出的方程式中有a, b, c三個變量,那麼關於a, b, c之間的關係式我們都能求,但是如果是其它變量,

原创 leetcode322——零錢兌換——java實現

題目要求: 分析: 這道題依然採用動態規劃來做,跟完全平方數那道題目的思想差不多。我認爲自己還沒有很好地掌握動態規劃思想,因爲不知道從哪裏去思考,想出來的方法也是錯誤的,得再多加強訓練。 在這道題中,肯定要從coins這個數組和

原创 leetcode79——單詞搜索——java實現

題目要求: 分析: 這道題目採用 DFS + 回溯 來做,它有四個方向來判斷。設置一個visited數組,用來節點表示有沒有訪問過。 話說不清楚,直接上代碼吧。 具體代碼如下: class Solution { pub

原创 leetcode208——實現Trie(前綴樹)——java實現

題目要求: 分析: 首先來了解下什麼叫前綴樹,請參照這篇博客: 數據結構與算法(十一)Trie字典樹 字典樹的結構如下圖所示: 其中根節點是空的 接下來就來思考如何實現代碼。 首先,我們設置一個TrieNode的數據結構,裏面

原创 leetcode114——二叉樹展開爲鏈表——java實現

題目要求: 分析: 具體代碼如下: public class Solution { public void flatten(TreeNode root) { if(root == null)

原创 leetcode437——路徑總和III——java實現

題目要求: 分析: 關於樹的題目,就要考慮利用遞歸。 這裏,就考慮根 + 左子樹 + 右子樹 = sum即可。 那麼這裏只需要用sum是否爲0作爲遞歸結束的條件即可。 具體代碼如下: /** * Definition for

原创 leetcode617——合併二叉樹——java實現

題目要求: 分析: 題目有提示,說合並必須從兩個樹的根節點開始,那麼我們先定義一棵樹的根root,其值爲t1.val + t2.val,接下來就對其左子樹和右子樹進行遞歸,最後再返回這個root即可。 具體代碼如下: /**

原创 leetcode538——把二叉搜索樹轉換爲累加樹——java實現

題目要求: 分析: 樹的題目,又要用遞歸了。 二叉搜索樹的左子樹的所有值均比根的值要小,右子樹的值均比根的值要大。 在這道題目中,我們要求的是比該節點大的值加上該節點的和,那麼可以從右子樹開始。 將右子樹看作一個整體,進行遞歸。

原创 leetcode61——旋轉鏈表——java實現

題目要求: 分析: 這道題目似曾相識,我曾經說過了dummy大法好,在這裏也是一樣的。 先定義一個節點fast,找到鏈表的尾部,固定在那裏,並順便求出這個鏈表的長度len; 再定義一個節點slow,走len - (k % len

原创 leetcode543——二叉樹的直徑——java實現

題目要求: 分析: 遞歸,對,沒錯,還是遞歸。 還是將這棵樹看作一個整體,我們要求的是左子樹的最大深度 + 右子樹的最大深度。 那麼,就先將左子樹進行遞歸,再將右子樹進行遞歸,將它們相加,求所有左子樹深度 + 右子樹深度的最大值

原创 leetcode461——漢明距離——java實現

題目要求: 分析: 異或之後,不同的地方都會變成1,所以只需要求1的個數就好了。 具體代碼如下: class Solution { public int hammingDistance(int x, int y) {

原创 leetcode581——最短無序連續子數組——java實現

題目要求: 分析: 另外設置一個數組nums1,把nums給拷貝給它,然後對它進行排序。 排完序之後,將nums與nums1進行比較,找出兩者最開始不一樣的下標left以及最後一個不一樣的值所對應的下標right,right -