原创 leetcode:除數博弈

題目來源:力扣 這是我做的第一道動態規劃題目,今天看了一上午算法導論動態規劃那一章,下午準備檢驗一下自己的理解.雖然這道題難度爲簡單級別,但在自己獨立思考下做出來了,感覺美滋滋! 題目描述: 愛麗絲和鮑勃一起玩遊戲,他們輪流行動

原创 leetcode:不同的二叉搜索樹

題目來源:力扣 題目介紹: 給定一個整數 n,求以 1 … n 爲節點組成的二叉搜索樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜索樹. 審題: 考慮對於從iii到jj

原创 leetcode:使用最小花費爬樓梯

題目來源:力扣 題目介紹: 數組的每個索引做爲一個階梯,第 i個階梯對應着一個非負數的體力花費值 costi。 每當你爬上一個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬一個階梯或者爬兩個階梯。 您需要找到達到樓層頂部的

原创 leetcode:我能贏嗎

題目來源:力扣 題目介紹: 在 “100 game” 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即爲勝者。 如果我們將遊戲規則改爲 “玩家不能重複使用整數” 呢?

原创 leetcode:葉值的最小代價生成樹

題目來源:力扣 題目介紹: 給你一個正整數數組 arr,考慮所有滿足以下條件的二叉樹: 每個節點都有 0 個或是 2 個子節點。 數組 arr 中的值與樹的中序遍歷中每個葉節點的值一一對應。(知識回顧:如果一個節點有 0 個子節

原创 對B樹/B+樹的理解

1. B樹/B+樹的應用場景 對於大規模數據,受計算機主存限制,通常無法一次性將全部數據加載進主存當中,只能分批加載. 目前,輔存(外部存儲)通常有兩種設備,固態硬盤與機械硬盤.其中固態硬盤與主存類似,可以實現數據的隨機存取,而

原创 設計模式之:簡單工程模式+策略模式

1. 簡單工廠模式 1.1要點 對於一組相關的策略類:使用接口+多個實現類 使用簡單工廠創建策略類, 將具體類對客戶代碼封裝 1.2 代碼 public interface IStrategy{ public void ru

原创 設計模式:裝飾器模式

1. 類的功能擴展 面向對象設計中, 可擴展通常是類設計中的一項重要考量. 在不改變原有類的情況下, 對當前類進行擴展的最直接方法是繼承當前類, 並在子類中擴展其功能. 然而, 如果我們對當前類的擴展並不是專屬與該類的, 例如對

原创 基於管程的多線程程序

注:本文主要參考自<<現代操作系統>>2.3.7節 在互斥量與條件變量一文中,我們使用互斥量與條件變量解決了多線程生產者與消費者問題.其中互斥量主要用於確保生產者與消費者不會同時訪問緩衝區,條件變量則用於確保線程僅在其執行必要條件

原创 死鎖檢測與恢復

注:本文主要參考自<<現代操作系統>>6.3,6.4節 在死鎖一文中,我們提到死鎖問題有四種解決方案.本文將主要介紹第二種方法:死鎖檢測與恢復. 此處簡要提及一下第一種方法,忽略死鎖.如果程序員可以推斷死鎖發生的概率非常小,且發生

原创 系統爲什麼會死鎖?

注:本文主要參考<<現代操作系統>>6.1,6.2節 何爲死鎖 先給大家講一個關於死鎖的笑話: 某天張三去面試,面試官問他你知道什麼是死鎖嗎?張三說:你先給我offer我就告訴你.面試官說你先告訴我,我再給你offer.張三說:不

原创 如何避免多進程(線程)因競爭條件引發的錯誤?

注:本文主要參考自<<現代操作系統>>第2章 如果避免多進程(線程)因競爭條件引發執行錯誤? 多進程程序競爭條件 對於多進程或多線程協作程序,如果多個執行程序間需要訪問共享內存區域,則程序編寫人員一定要仔細判斷程序執行邏輯,確保多

原创 互斥量,條件變量

注:本文主要參考<<現代操作系統>>2.3.6節 在進程喚醒與睡眠一文中,針對多進程的生產者-消費者問題,我們提出了基於信號量的解決方案.該方案避免了進程在等待其要求的下一步執行條件時進入忙等待狀態.我們使用了三個信號量,信號量m

原创 進程喚醒與睡眠

注:本文主要參考自<<現代操作系統>>2.3.4, 2.3.5節 進程喚醒與睡眠 使用睡眠與喚醒避免忙等待 在前一節如何避免多進程(線程)因競爭條件引發的錯誤?,我們提出了集中能保證多個進程互斥訪問臨界區,我們所提出的解決方案均使