知識點
時間複雜度
暴力列舉
o(n)
從 1 到 n-1 列舉,計算 (nums[i]-1)*(nums[i-1]-1) 。並記錄最大值。
class
solution
}return anw;}}
;
知識點
時間複雜度
排序,列舉
o(nlog(n)+mlog(m))
如果知道切完後蛋糕的最大高度及寬度,那麼就可以求得最大面積。
那麼如何求得最大高度及長度呢?先以最大寬度為例:
最大高度的求解方法類似,不再贅述。
class
solution
for(
int i =
1; i < verticalcuts.
size()
; i++
)return
int64_t
(maxh)
*int64_t
(maxw)
%1000000007;}
};
知識點
時間複雜度
鄰接表,樹的深度遍歷
o(nodes + edges)
先根據 connections 構建鄰接表,以便進行dfs。
構建鄰接表時需注意:connections 是有向邊,鄰接表需構建成無向邊。這時我們需要在鄰接表中每條邊與connections中對應邊的方向是否一致。
然後從 0 結點開始遍歷,記錄遍歷過程中,與遍歷方向一致的邊的數量。
為什麼是與遍歷方向一致的邊呢?因為0 是遍歷的起點,而題目描述中, 0 應該是終點。所以與遍歷方向一致的邊應該被調整。
比如在下圖中,遍歷過程中用到的鄰接表中的邊有:
其中僅有0到2這一條邊,其對應的connections中的邊與遍歷方向一致。所以需調整的邊數為 1 。
};知識點
時間複雜度
動態規劃,排列組合
o(n^3*m^3),n,m分別為球數和顏色的數量
首先需要解決乙個排列問題,向 b 個球種插入 q 個相同的球,一共有多少種不同的插入方法。這個可以參考**中的cal函式及其注釋。(或許有高階的排列組合公式?可惜我不會啊!只能用dp了。
其次, 需要計算總的排列數 all,及可行的排列數 correct。(還是用dp來解決
設,dp(i,j,k,p,q) 代表放完前 i 種顏色時,前半部分有 j 個球,p 種顏色,後半部分有 k 個球,q 種顏色的方案數。那麼:
狀態轉移考慮,對於第 i 種顏色有 t 個球給前半部分,balls[i]-t 給後半部分。那麼:
詳細解釋可以參見注釋。
class
solution
// 有 slots 個槽,插入 balls 個球的方案數。
long
double
dfs(
int slots,
int balls)
return1;
// 0 個槽,0個球,顯然只有一種方案}if
(balls ==0)
//solution 其實是乙個記憶化陣列。
//solution 會初始化為 -1。如果其大於 -0.5 說明已被計算過。不和 0 做比較是為了避免精度問題。
if(solution[slots]
[balls]
>
-0.5
)long
double anw =0;
for(
int i =
0; i <= balls; i++)
solution[slots]
[balls]
= anw;
return anw;
}long
double
alloc
(int a,
int b,
int p,
int q)
double
getprobability
(vector<
int>
& balls)
}//統計球的個數
int n =0;
for(
auto v : balls)
memset
(dp,0,
sizeof
(dp));
dp[0]
[0][
0][0
][0]
=1;//列舉顏色
leetcode 第191場周賽
陣列中兩元素的最大乘積 切割後面積最大的蛋糕 重新規劃路線 兩個盒子中球的顏色數相同的概率 3分 簡單 4分 中等 5分 中等 7分 困難 其實就是題目就是要求陣列中兩個最大的值 維護最大值first mx,第二大值second mx 遍歷陣列更新這兩值即可 相當於遍歷了一遍nums陣列,故為o n...
第191場周賽
class solution return res 這裡有個注意的點,maxh maxw這兩個int的值的乘積會超過int的範圍,所以要先轉換為double class solution maxh maxh h horizontalcuts hcut 1 maxh h horizontalcuts ...
leetcode 第132場周賽
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...