原创 劍指Offer——第一個只出現一次的字符

題目描述 在一個字符串(0<=字符串長度<=10000,全部由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 思路:因爲char類型爲1B=8bits,所以採用map來存儲256

原创 劍指Offer——從上往下打印二叉樹

題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右打印。 思路:藉助隊列,若左孩子不空,入左孩子;右孩子不空,入右孩子。 vector<int> PrintFromTopToBottom(TreeNode* root) {

原创 劍指Offer——棧的壓入、彈出序列

題目描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4

原创 劍指Offer——最小的k個數

題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 思路:1,快排思想,一次partition找到第low小位置,多次partition直到low=

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

題目描述 輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前) 思路:先序遍歷,

原创 劍指Offer——二叉搜索樹的後序遍歷序列

題目描述 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。 思路:對於二叉搜索樹的後序遍歷序列來說,最後一個節點的爲根節點,前面應該有一半節

原创 劍指Offer——數組中出現次數超過一半的數字

題目描述 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。 1,ma

原创 劍指Offer——樹的子結構

題目描述 輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構) 思路:要依次遍歷A中的節點,找到和B的根節點一樣的節點時,就檢查A中以當前節點存在的子樹是否包含B。 class Solutio

原创 劍指Offer——包含min函數的棧

題目描述 定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。 思路:使用兩個棧,一個存數據,一個存最小值,兩個棧中的元素數量始終是一致的,也就是數據棧中push元素時,也要把當前

原创 劍指Offer——合併兩個排序的鏈表

非遞歸版 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(!pHead1) return pHead2;

原创 劍指Offer——二叉樹的鏡像

題目描述 操作給定的二叉樹,將其變換爲源二叉樹的鏡像。 輸入描述: 二叉樹的鏡像定義:源二叉樹 8 / \ 6 10 / \ / \ 5 7 9 11 鏡像二叉樹 8 /

原创 編程——哈希表

求最大公共子串的長度 例如 “abcabcbb”->3 “bbb”->1 思路:採用雙指針,low,high。每次用high指向的元素在哈希表中查找上一次出現的位置,若該位置>=low,則說明在low到high之間已經存在該元素,

原创 劍指Offer——數值的整數次方

思路:考慮邊界情況,1:0-exponent基數爲0,指數爲負數的話,沒有意義;2:基數不爲0,指數爲負數的話,要考慮結果變爲倒數。 class Solution { public: double Power(double

原创 劍指offer——重建二叉樹

思路:知道前序和中序求二叉樹,我覺得主要是弄清前序序列和中序序列的長度區間。首先在前序裏面找根節點,在中序裏面找左右子樹;在中序序列裏面找到根節點所在的位置,求出左子樹長度和右子樹長度,然後遞歸建樹。 TreeNode* reCo

原创 劍指offer——二維數組中的查找

思路:考慮從四個角遍歷,首先去除左上角和右下角的考慮,因爲在左上角的走向都是遞增的,在右下角的走向都是遞減的,沒法判斷往哪個線路走;所以要考慮從另外兩個角出發。 bool Find(int target, vector<vecto