劍指offer解題思路簡述:51-60

  • 面試題51:數組中的逆序對

方法一:劍指方法,參考歸併排序,先把所有的數據分成每兩個一個小組,統計逆序數後排序,然後把相鄰的每兩個含有兩個數字的小組組成一個有四個數字的組,在組合的時侯統計逆序對並排序

方法二:得到一個排序後的數組,然後遍歷原數組,查找當前數字在排序後數組中的位置,即爲當前數字的逆序數,累加後在原數組中刪掉該數,接着往後處理

  • 面試題52:兩個鏈表的第一個公共節點

方法一:先遍歷第一個鏈表,每個節點都在鏈表二中查找有沒有,時間複雜度m*n

方法二:因爲這種鏈表呈現的是一個y字型,所以可以從後往前比較,第一個出現不同的節點就是分叉的地方,所以可以用兩個棧分別存下兩條路徑的節點,然後從後往前比較,時間複雜度m+n,空間複雜度m+n

方法三:先挨個遍歷鏈表記錄兩個的長度,然後讓長的先走差值步,短的再開始走,碰到的第一個相同的節點即爲第一個公共節點

  • 面試題53:在排序數組中查找數字

方法:二分查找分別找到第一個k記下索引,再找到第二個k記下索引,求差,時間複雜度nlogn

方法:二分查找,如果中間數的索引和數值相等則檢查右邊,反之檢查左邊

方法:二分查找,如果中間數的索引小於數值,則檢查左邊,反之檢查右邊

  • 面試題54:二叉搜索樹的第K大節點

方法:二叉搜索樹中序遍歷得到的就是一個排序的結果

  • 面試題55:二叉樹的深度

方法:遞歸,二叉樹的深度等於max(左子樹深度,右子樹深度)+1

方法:後序遍歷,在遍歷的時候記錄每個節點的深度

  • 面試題56:數組中數字出現的次數

方法:利用的思想是,一個數字抑或自己結果爲0,所以先將所有的數字抑或一次,得到的結果不爲0,找到爲1的位,用該位將原市數據分成兩類,所以兩個不相同的數字也被分到了兩個組裏,然後對每組進行剛纔的操作,最後的結果就是兩個要求的只出現一次的數

方法:把所有數字的二進制表示的每一位加起來,最後的結果如果那一位可以被3整除,說明只出現一次的那個數的那一位是0,反之是1,需要一個長度爲32位的輔助空間,時間複雜度n

  • 面試題57:和爲s的數字

方法:設置兩個指針分別位於數組的頭和尾,然後根據和的大小來往前或者往後移動

方法:初始化一個[1,2]的list,如果該序列的數小於s,則後面增加一個3,如果大,則前面減少一個1,while的終止條件是,samll<middle.

  • 面試題58:翻轉字符串

方法一:翻轉兩次,先整體翻轉,再單詞內部翻轉

方法二:用split函數分割到list中,然後while循環,前後兩個指針交換

方法一:分成兩部分ab和cdefg,先分別翻轉這兩部分ba和gfedc,再翻轉整個字符串

方法二:list切片s[n:]+s[:n]

  • 面試題59:隊列的最大值

方法一:簡單直接每次max(k)個數的最大值,依次保存,時間複雜度kn

方法二:在一個新list裏,每次保存當前的最大值的索引,當往後移動一位時,先覈對下標,若最大值下表在比新數小k的範圍內,比較新數和當前的最大值,若小於最大值,則將新數append到list後,若大於最大值,則直接替換掉原list。

方法:設置一個輔助隊列queuemax用來存放當前狀態下的最大值,具體操作爲,每當push時,從後開始比較queuemax的值和當前要插入的值,將比它小的都刪除,然後壓入當前值,pop時,直接返回queuemax中的值,當pop的值和queuemax中最前面的值相等的時候,將queuemax最前面的值也pop出。

  • 面試題60:n個骰子的點數

方法;動態規劃,還沒搞明白

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章