TOP 100 51 - 56

160. 相交鏈表

我的思路

先到空的node轉向另一個鏈表重新開始。
然後根據誰是空的走到另一邊也走到空爲止,此時兩個節點在同一起跑線
再相遇就是相交點或者大家都爲空了

題解思路

我在判斷誰先走到nullptr上寫了大量代碼處理.其實大家都是各自走自己的一遍,對方的一遍到達空

while (nodeA != nodeB) {
    if (nodeA != nullptr) {
        nodeA = nodeA -> next;
    }
    else {
        nodeA = headB;
    }

    if (nodeB != nullptr) {
        nodeB = nodeB -> next;
    }
    else {
        nodeB = headA;
    }
}

某一刻爲空時我們就走上了對方走過的路.
"錯的人遲早會走散,而對的人終會相逢"

TM就是代碼的浪漫嗎

155. 最小棧

我原來的思路是用隊列或者哈希表什麼的來模擬一個棧。結果告訴我搞一個同一數據結構的輔助棧就可以了...

題解思路

使用輔助棧存放最小元素
1.如果不小於最小元素,assistantstack就push. st.top <= ast.top
注意:等於的時候ast也push
2.pop:不大於就pop. ast.top <= st.top

152. 乘積最大子數組

題解思路

當前乘積max有三個可能,一個是dpmax[i - 1] * nums[i] nums[i] dpmin[i - 1] * nums[i]

for (int i = 1; i < len; ++i) {
     int premax = maxnum, premin = minnum;
     maxnum = max(nums[i], max(premax * nums[i], premin * nums[i]));
     minnum = min(nums[i], min(premin * nums[i], premax * nums[i]));
     ans = max(ans, maxnum);
}

需要注意的地方:還需要比較nums[i]是爲了消除0的影響[2,3,0,4,4,4]幫助災後重建.否則0後大家都是0了

148. 排序鏈表

題解思路

分爲兩個方法
1.將當前鏈表拆成長度相似的兩個,分別排序
2.合併有序鏈表

146. LRU 緩存機制

題解思路

查找和獲得使用哈希表就能實現O(1)的複雜度,但是不能實現長時間未使用的在最後,鏈表能夠處理的了這個問題,但是單向無法記錄最後的指針,所以使用雙向鏈表

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