原创 劍指offer Q15 二進制中1的個數

思路 本題要求計算出一個整數的二進制中的1的個數,考察的是位運算的運用和理解。 本題會用到>>、>>>、&等運算符,不會的可以去查一下。 本題的重點在於怎樣去統計1的個數,其實這個和去計算一個數各位數之和類似(比如讓你求39的各位

原创 LeetCode 劍指offer Q41 數字序列中某一位的數字

思路 這一題考查的是數學知識。 首先假設target爲我們要找的第n位所在的數字,那我們可以先找到它的位數,設bit=1爲位數,count=9爲一位需要剪去的數字個數。因爲都是從0開始計數,所以可以忽略0位。,例如n=2332,則

原创 LeetCode劍指offer Q32——l 從上到下打印二叉樹

思路 簡單的層次遍歷即可,使用隊列進行層次掃描。但是在此過程中需要用到List 集合,但是函數要求的返回值爲int[],因此在轉換方式上我使用了兩種方式,一種就是forEach 直接一個一個的轉,另一種就是使用Arrays的map

原创 leetcode 劍指offer14 割繩子 動態規劃

package jianzhioffer; /** * 割繩子1 * 一般想到的都是動態規劃 從長爲n的繩子中割出m段,m和n都大於1, * 首先思考動態規劃遞推關係,設f(n)爲長度爲n的繩子的最大乘積 * 那我們考慮f

原创 LeetCode劍指offer Q32_lll 從上到下打印二叉樹lll

思路 和前兩題一樣,都可以使用bfs逐層進行掃描,不過在掃描的時候需要記錄此時的層數,若層數爲奇數,則不變從左到右添加結果,否則則將此層掃描的結果進行翻轉然後加到結果list中去。還是採用層次遍歷的方式,比較簡單。 代碼 /**

原创 LeetCode 劍指offer Q38字符串的排列

思路 求一個字符串的全排列組合,直接想到使用回溯中的全排列算法。 回顧一下全排列算法: 假設 需要排列 abc。 下圖表示了整個遞歸過程。對abc進行全排列就是有三個位置用abc去填,全排列算法使用交換來實現填入操作。如圖,第一層

原创 LeetCode劍指offer Q36 二叉搜索樹與雙向鏈表 java 雙百

思路 要將一個二叉搜索樹轉化爲升序的循環雙向鏈表,很明顯使用中序遍歷能獲得升序。然後思考怎樣改造中序遍歷能夠構建循環雙向鏈表且不需要新建結點。考慮到雙向,則肯定需要保存前驅節點,因此如下設置: 新建pre、head兩個指針,pr

原创 劍指offer Q10 -I 斐波那契數列

思路 本題看起來是簡單題,但是實際上對性能和結果都有要求 直接使用遞歸寫法性能上是不能通過的。只能使用迭代寫法,通過兩個變量re1和re2來保存前一步和前前一步的結果,最後返回re2即可。但是注意,本題的結果可能非常大,所以在每次

原创 LeetCode 劍指offer Q47禮物的最大值典型dp

思路 典型的局部最優組成整體的最優解。貪心dp即可。設dp[i][j]爲到達grid[i][j]時的最大禮物值。那麼dp[i]的大小便和dp[i-1][j]和dp[i][j-1]相關了。取上和左中較大即可。 代碼 class So

原创 劍指offer Q07 重建二叉樹

思路 這是第二遍刷題了 本題主要就是怎樣從一個先序序列和一箇中序序列怎樣推導出一棵樹。首先,從先序可以得到root結點就是第一個節點,然後到中序中去找其對應的位置inPos,然後該位置的左邊就是root的左子樹中序序列,右邊就是r

原创 LeetCode劍指offer Q37 序列化二叉樹 bug解法

思路 看到題目給的例子時,我以爲在序列化時時將整棵樹作爲滿二叉樹來序列化,但是在測試時發現並不是,它只是判斷每個節點的左右子樹是否爲null,如果是則添加爲null。但是本題有一些bug,第一個:序列化函數中將最後一層葉子結點的子

原创 LeetCode Q1013 將數組分成和相等的三部分

思路 因爲是戀曲切割,分爲三個子段。又考慮到子段的和相等,因此直接先算出子段的長度,然後分別從前和後對數組進行循環掃描計數,當前面子段的和等於子段長時推出循環,同理後面子段也如此操作。 代碼 class Solution {

原创 LeetCode 劍指offer Q35 複雜鏈表的複製 兩種方式

思路 第一個就是通過使用hash,第二個就是通過在原鏈表的基礎上進行修改。 代碼 package algorithm.jianzhiOffer; import java.util.HashMap; import java.uti

原创 LeetCode 劍指offer@26樹的子結構 java雙100%

思路 本題其實就是個匹配問題。 樹的匹配問題,第一步找到第一個匹配點,然後進行逐個匹配,找到第一個匹配點可以採用層次便利或者bfs、dfs等等。本題我首先使用了層次遍歷,但是發現結果只超過5%,改成遞歸形式的dfs之後超過100%

原创 LeetCode劍指offerQ34 二叉樹中和爲某一值的路徑

思路 經典的dfs題目,設置一個變量用來記錄當前路徑上的和count,再用一個list(r)用來記錄當前的路徑。最後只需要在葉子結點時判斷是否count==sum,若相等則將r添加進入最後的結果list,注意添加時需要進行深複製操