原创 一刷劍指offer(39)——二叉樹的深度

題目: 輸入一顆二叉樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度爲樹的深度。 二叉樹結點定義如下: struct BinaryTreeNode { int m_n

原创 一刷劍指offer(23)——從上往下打印二叉樹

題目: 從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序打印。二叉樹結點定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode*

原创 一刷劍指offer(36)——數組中的逆序對

題目: 在數組中的兩個數字如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對總數。 例如數組{7,5,6,4|中,存在5個逆序對:(7,6),(7,5),(7,4),(6,4),(5,4)。

原创 一刷劍指offer(21)——包含min函數的棧

題目: 定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min、push和pop的時間複雜度都是O(1)。 看到這個問題,第一反應就是每次壓入一個新元素進棧時,將棧裏的所有元素排序,讓最小的元素位於

原创 一刷劍指offer(34)——醜數

題目: 我們把只含因子2、3、5的數稱作醜數。求按從小到大的順序的第1500個醜數。例如6、8都是醜數,但14不是,因爲它包含因子7。習慣上,我們把1當作第一個醜數。 根據醜數的定義,醜數只能被2、3、5整數。 判斷一個數是否爲醜數:

原创 一刷劍指offer(41)——和爲s的兩個數字VS和爲s的連續正數序列

題目: 輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得他們的和正好是s。如果有多對數字的和爲s,輸出任意一對即可。 最直接的做法:雙重循環依次嘗試,時間複雜度O(n^2)。 更好的方法: 1、在數組中選擇兩個數字(不妨設兩

原创 一刷劍指offer(38)——數字在排序數組中出現的次數

題目: 統計一個數字在排序數組中出現的次數。例如輸入排序數組{1,2,3,3,3,3,4,5}和數字3,由於3在這個數組中出現了4次,因此輸出4. 最直接的做法:先用二分查找算法找到一個3,由於3可能出現多次,因此我們找到的3的左右兩邊

原创 一刷劍指offer(18)——樹的子結構

題目: 輸入兩顆二叉樹A和B,判斷B是不是A的子結構。 二叉樹結點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft;

原创 一刷劍指offer(24)——二叉搜索樹的後序遍歷序列

題目: 輸入一個整數數組,判斷該數組是不是某二叉樹的後序遍歷結果。如果是,則返回true,否則返回false。假設輸入的數組的任意兩個數字互不相同。 在後序遍歷得到的序列中,最後一個數字是樹的根結點。數組中前面的數字可以分爲兩部分:第一

原创 一刷劍指offer(19)——二叉樹的鏡像

題目: 請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。 二叉樹結點定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft;

原创 一刷劍指offer(20)——順時針打印矩陣

題目: 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。 由於是以從外圈到內圈的順序依次打印,可以將矩形想象成若干個圈,循環打印矩陣,每一次打印矩陣中的一個圈。 循環結束的條件: 注意到左上角的座標中行標和列標總是相同的。

原创 一刷劍指offer(35)——第一個只出現一次的字符

題目: 在字符串中找到第一個只出現一次的字符。如輸入“abaccdeff”,輸出'b'。 最直觀的做法:從頭開始掃描這個字符串中每個字符。當訪問到某個字符時,拿這個字符和後面的每個字符相比較,如果在後面沒有發現重複的字符,則該字符爲只出

原创 一刷劍指offer(29)——數組中出現次數超過一半的數字

題目: 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。 直接的思路就是先給數組進行排序,然後就能很容易地統計出每個數字出現的次數。 但是這種思路並沒有考慮到數組的特性:數組中有一個數字出現的次數超過了數組長度的一半。如果

原创 一刷劍指offer(28)——字符串的排列

題目: 輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab,cba。 求整個字符串的排列,可以看成兩步: 1、求所有可能出現在第一

原创 一刷劍指offer(26)——複雜鏈表的複製

題目: 請實現函數ComplexListNode* Clone(ComplexListNode* pHead),複製一個複雜鏈表。在複雜鏈表中,每個結點除了有一個m_pNext指針指向下一個結點外,還有一個m_pSibling指向鏈表中