1.1 CPU 佔用率html
http://www.javashuo.com/article/p-qyvyqoiq-ce.html算法
1.2 中國象棋將帥數組
https://blog.csdn.net/kabini/article/details/2256421
https://blog.csdn.net/ltyqljhwcm/article/details/52203578服務器
1.3 烙餅排序函數
https://blog.csdn.net/jiyangsb/article/details/45970381優化
1.4 書店促銷.net
書店促銷活動,某套書一共有五卷。假設每一卷單獨銷售均需8歐元,多買則有折扣,具體折扣以下:線程
2 | 5% |
3 | 10% |
4 | 20% |
5 | 25% |
設計算法,計算出讀者購買一批書的最低價格。設計
可使用動態規劃算法或優化的貪心算法。htm
https://blog.csdn.net/eeelan/article/details/76083174
1.5 快速找出故障機器
有不少服務器存儲數據,假設一個機器僅存儲一個標號爲ID的記錄,假設機器總量在10億如下且ID是小於10億的整數,假設每份數據保存兩個備份,這樣就有兩個機器存儲了一樣的數據。
問題:
1.假設在某個時間獲得一個數據文件ID的列表,是否能快速地找出表中僅出現一次的ID?即快速找出出現故障的機器存儲的數據ID。
2.若是有兩臺機器出現故障呢?(假設存儲同一份數據的兩臺機器不會同時出現故障,即列表中缺乏的是兩個不等的ID
問題轉化:
有不少的ID,其中只有一個ID出現的次數小於2,其餘正常ID出現的次數都等於2,問如何找到這個次數爲1的ID.
解法一:暴力解決
方法:遍歷列表,利用一個map記下每次出現的ID和出現次數+1,遍歷完畢以後,出現次數小於2的ID就是咱們想要的結果。
時間複雜度:O(N)
空間複雜度:O(N)
缺點:當記錄N多達幾G甚至幾十G時,空間複雜度將會成爲瓶頸。
解法二:兩次即刪
方法:遍歷列表,利用變長數組記錄每一個ID,每次遇到一個ID,就向變長數組中增長一個元素,若是這個ID出現的次數爲2,那麼就從變長數組中刪除這個ID, 最後變長數組中剩下的ID就是咱們尋找的ID。
時間複雜度:O(N)
空間複雜度:最好O(1),最壞O(N)
解法三:異或運算
思路:摒棄遍歷列表技術方式
目標:把空間複雜度下降到常數甚至爲1的級別,即便用一個變量來記錄遍歷列表的結果
構造函數:
x(i) = f(List[0], List[1], List[2], ... , List[i])
即:這個變量是已經遍歷過的列表元素的函數
該函數須要知足的條件:x(N) = ID_LOST
運算:異或
性質:X 異或 X = 0, X 異或 0 = X, 異或操做知足交換率和結合律
方法:因此的ID的異或值就等於這個僅出現一次的ID。
時間複雜度:O(N)
空間複雜度:O(1)
解法四:尋找不變量
方法:全部ID的和是不變的,因此用全部ID的和減去現有ID的和即得丟失的ID。
時間複雜度:O(N)
空間複雜度:O(1)
缺點:不適用於丟失多個ID的狀況
問題進階一:當有兩個ID的機器一塊兒出現故障,肯定出現故障的機器
若是缺乏的兩個ID不相同
解法:異或運算
對全部ID進行異或運算,結果爲a(不等於0)
肯定a的某一個爲1的二進制位置b
將全部ID分爲兩組:二進制位置b爲1的爲一組A,二進制位置爲0的爲一組B
對AB兩組分別進行異或運算,獲得兩個不爲0的數字,即爲丟失的兩個ID
若是不能肯定缺乏的兩個ID是否相同
解法一:
由於已知丟失兩個數是相同的,因此經過上面的解法四能夠獲得 x + y = a, x * 2 = a, x = a/2
固然,這種方法是創建在已知兩個數是相同的前提下的。
解法二:(通用解法,對丟失N個數的狀況一樣適用)
若是不知道兩個數是否相同,能夠經過創建方程組來解決
解法一已經給出了一個方程組: x+y=a
那麼再計算丟失先後的全部ID的平方和,進行相減,能夠又獲得一個方程: x^2 + y^2 = b
聯立方程組便可求解。
問題進階二:當有多個ID的機器一塊兒出現故障,肯定出現故障的機器
解法一:
參考問題進階一解法二。
缺點:當N過大時,N個方程組不易求解。
解法二:
參考解法二,遍歷+計數+兩次即刪。
參考:
https://blog.csdn.net/zs634134578/article/details/18046317
http://blog.csdn.net/insistgogo/article/details/7687936
1.6 飲料供應
水房能容納飲料的總量是V,有一批飲料,每種飲料單個容量都是2的方冪,每種飲料信息以下:(Si,Vi,Ci,Hi)分別對應(名字,容量,滿意度),求在知足總容量等於V的狀況下,求滿意度的最大值。
分析:
一、動態規劃解法
沒有懸念,優化問題就用動態規劃、貪心算法、分支限界輪番上陣就行了。設Opt(V’,i)表示從i到n-1種飲料中,Ci爲第i種飲料可能的最大數量,算出總量爲V’的方案中滿意度之和的最大值。那麼遞歸式就應該是:
Opt(V’,i)=max{ k * Hi+Opt(V’-Vi * k,i+1)}(k=0,1,2…,Ci,i=0,1,2…,n-1)
二、動態規劃法的變形:備忘錄法
三、貪心算法
書中的貪心解法似曾相識,把信息按照飲料的容量排序(其中設咱們有n0種容量爲20的飲料)
而後按照下面的順序進行貪心選擇:
(1) 飲料總量爲1,從容量爲20的飲料中選出快樂指數最大的。
(2) 飲料總量爲2,從容量爲21的飲料中選出快樂指數最大的(設爲H1),與容量爲20的飲料中快樂指數最大的(設爲H0),比較H1和2* H0,取出其中最大者爲當前最佳選擇
(3) 繼續進行下去,直到求出Opt(V,0)
參考:
https://blog.csdn.net/kabini/article/details/2311946
1.7 光影切割
在一個平面內有一個矩形區域,直線穿過矩形能夠將其分割爲不一樣的區域,且在這個平面中不存在三條直線相交一點的狀況。求當有N條直線穿過矩形時,它被分割爲多少個區域?
解法一:
平面倍劃分紅多少塊的問題能夠轉化爲直線的交點有多少個的問題。
兩條直線-->一個交點-->空間分紅4個部分
三條直線-->兩個交點-->空間分紅6個部分
三條直線-->三個交點-->空間分紅7個部分
每增長一條直線,若是增長M個交點,那麼這條直線被新增長的M個交點,分紅M+1段。每一段直線會將原來一塊區域分紅兩塊,所以,新增長M+1塊新區域。
若是總共有N條直線,M個交點,那麼區域的數目爲N+M+1。如何證實?將N條直線逐一投影到座標區間上,假設第K條直線與以前的K-1條直線的焦點爲Nk個,那麼它使得區間內的區域塊增長Nk+1個。則N條直線投影完畢後,全部區域塊的數目爲:
1+sigma(Nk+1)(1-->n)=1+N+sigma(Nk)(1-->n)=1+N+M
所以,求出全部直線兩兩相交的交點,而後再查找落在區間內的交點,就能夠計算出劃分的區域塊數。將全部交點存儲於數組Intersect中,而後計算。這樣,算法的複雜度就轉化爲查找交點數組的問題了。
數組初始化,即計算全部交點,時間複雜度爲O(N^2)。每次查詢的時間複雜度爲O(M)。
若是在初始化後對全部交點按X軸座標排序,則複雜度爲O(N^2+M*logM),以後進行二分查找,每次查找的時間複雜度爲O(logM)。
解法二:
一個交點的狀況,兩條直線與左邊界的交點順序爲(a,b),與右邊界的交點順序爲(b,a),順序反過來了。若是沒有交點,則順序不變。
區域內的交點數目等於一個邊界上交點順序相對另外一個邊界交點順序的逆序總數(利用到條件「沒有三條直線相交於一個點」)。
問題轉化爲求一個N個元素數組的逆序數。
求解逆序數的直接方法時間複雜度爲O(N^2),若用分治策略,可降爲O(N*logN)。分治思想以下:求前N/2個元素的逆序數,再求後N/2個元素的逆序數,最後在排序過程當中合併先後兩部分之間的逆序數。
參考:
https://blog.csdn.net/lonelycatcher/article/details/7907333
1.8 電梯調度
全部的員工均在1樓進電梯的時候,選擇所要到達的樓層。而後計算出停靠的樓層i,當到達樓層i的時候,電梯中止。全部人走出電梯,步行到所在的樓層中。求全部人爬的樓層數目和的最小值。
解法一:
使用簡單的方法,直接將樓層從1到n開始遍歷
sum(person[i] * |i - j| ) 此表達式爲一個雙重循環,i與j均爲1-n的循環。
j下標表示電梯停靠的樓層。
person數組表示,對應i層的下電梯的人數。此算法負責度爲o(n*n)
對應的j是上述和爲最小的一層即爲所求。 上面的算法複雜度爲o(n)
解法2:
下面考慮一個簡單的算法,使其複雜度達到o(n)
考慮假如電梯停靠在某一樓層i處,假設在i處下樓的客人爲N2,
在i以上樓層的客人數目爲N3 ,在i一下樓層的客人數目爲N1。
且將電梯在i層中止時,所有人員的路程之和記爲T。
那麼加入電梯在i-1層停的話,則原來i層之上的人須要多爬一層,即增長了N3
第i層的人須要多爬一層,則結果增長了N2, i層之下的人則少爬了一層,結果減去N1
因此第i-1層的結果爲 T - N1 + N2 + N3 。即結果能夠即爲 T -(N1 - N2 - N3)
下面考慮在i+1層的結果,若電梯在i+1層中止的話,原來i層之上的客戶都會少爬一層,
則結果減小N3 ,而i層之下的人員則都會多爬一層即增長了N1 ,第i層的人員都會多爬一層
即爲增長了N2 。則結果爲 T + N1 + N2 - N3
綜上咱們得出,
(1)若N1 > N2 + N3的時候, 咱們在第i-1層 選擇電梯中止最好。
(2)若N1 + N2 < N3的時候, 咱們選擇在第i+1層中止電梯最好。
下面咱們能夠先計算出來當i=1時候的T ,而後判斷是否須要在i+1層中止,如果i+1層的花費
大於i層,則咱們能夠繼續計算,不然退出。
解法三:
假設只有兩我的,一個去9層,一個去2層,那麼無論電梯停在2至9層中間的任何樓層,兩我的的總花費都是7.就好比在數軸上點2和點9中間的任何點距離2和9的距離以後都是7。那麼停在哪都無所謂了。接着咱們擴展開來,假設有N我的,他們的目標樓層分別是2,3,3,4,5,5,5,7,7,8,9。按咱們的想法,對於兩端的(2,9)電梯只要停在他們之間都同樣。同理對於(3,8)電梯只要停在他們中間都同樣……。最終電梯只要停在中間那個數便可。也就是中位數。原來弄半天只需求出中位數便可啊。若是N是偶數個的話,停在中間那兩個數任何一個均可以的。歡迎你們對個人解法拍磚。代碼就不用了吧。
擴展1:
若是往上爬樓梯比較累,往下走較容易,假設往上走一層耗費k單位的能量,往下走一層只耗費1單位的能量。
擴展2:
M層電梯K個停靠層,可將最終問題分紅兩種狀況:1,第M層爲一個停靠層次;2,第M層不做爲停靠層次。第一種狀況經過動態規劃解出,第二種狀況運用第一種狀況子問題數據能夠解出。
解法:
用數組A[1]、A[2]、...A[M]分別記錄需到電梯1~M層的乘客人數;Cost[i][j]記錄i層到j層之間,只有第i和第j兩層能夠停靠,乘客(i和j層之間全部乘客)須要爬的電梯的最少層數;F[i][j]表示1~i層電梯之間,j個樓層停靠,且第i層必須是一個停靠層的的最優解;所求解爲S[M][K],即電梯總共M個層,有K個停靠層,使全部乘客全部乘客須要爬的電梯層數最少,該選擇哪些層停靠?最少是多少層?
狀態方程爲:
S[i][j] = min{F[i][j], min{F[i-t][j] + A[i]*t + A[i-1]*(t-1) + A[i-2]*(t-2)...A[i-t+1]*1} (1 <= t <= i-j) }
解釋:最外層min{}中前一部分表示第i層做爲停靠層的狀況,後一部分表示第i層不做爲停靠層的狀況
1.9 見面會安排
有n個學生參加見面會,分別對m個研究組中的若干個感興趣,爲了知足全部學生的要求,每一個學生都能參加本身感興趣的見面會,若是每一個見面會的時間爲t,如何安排才能使得全部見面會的總時間最短?
分析:
先創建模型,將m個見面會當作點,若是有一位同窗同時對兩個小組感興趣,就在這兩個小組對應的點間加上一條邊。不難看出,構造出這樣一幅圖後,問題轉化成求圖的最少着色問題。
參考:
https://blog.csdn.net/chdhust/article/details/8333567
1.10 雙線程高效下載
1.11-1.13 Nim 遊戲
1.14 連連看遊戲
1.15 數獨遊戲
解法一:廣度優先搜索。
解法二:先填滿中間矩陣,其餘區域經過矩陣置換求出。
1.16 24點遊戲
解法一:窮舉法
解法二:分治法
1.17 俄羅斯方塊遊戲
1.18 掃雷遊戲