第一次成功 \(ak\)
\(leetcode\) 周賽,決定寫篇部落格記錄一下。
這場周賽確實相對簡單一些。
目錄給你長度相等的兩個字串s1
和s2
。一次字串交換操作的步驟如下:選出某個字串中的兩個下標(不必不同),並交換這兩個下標所對應的字元。
如果對其中乙個字串執行最多一次字串交換就可以使兩個字串相等,返回true
;否則,返回false
。
示例 1:
輸入:s1 = "bank", s2 = "kanb"
輸出:true
解釋:例如,交換 s2 中的第乙個和最後乙個字元可以得到 "bank"
示例 2:
輸入:s1 = "attack", s2 = "defend"
輸出:false
解釋:一次字串交換無法使兩個字串相等
示例 3:
輸入:s1 = "kelb", s2 = "kelb"
輸出:true
解釋:兩個字串已經相等,所以不需要進行字串交換
示例 4:
輸入:s1 = "abcd", s2 = "dcba"
輸出:false
解決方案:資料範圍很小,暴力列舉所有可以交換的下標,時間複雜度 \(o(n^2)\) 。
class solution
}return false;}};
有乙個無向的星型圖,由n
個編號從1
到n
的節點組成。星型圖有乙個中心節點,並且恰有n - 1
條邊將中心節點與其他每個節點連線起來。
給你乙個二維整數陣列edges
,其中edges[i] = [ui, vi]
表示在節點ui
和vi
之間存在一條邊。請你找出並返回edges
所表示星型圖的中心節點。
示例 1:
輸入:edges = [[1,2],[2,3],[4,2]]
輸出:2
解釋:如上圖所示,節點 2 與其他每個節點都相連,所以節點 2 是中心節點。
示例 2:
輸入:edges = [[1,2],[5,1],[1,3],[1,4]]
輸出:1
解決方案:星型圖的中心節點度為 \(n-1\) ,其餘節點度為 \(1\) 。
隨便找兩條邊,他們的公共頂點就是中心節點。
class solution
};
一所學校裡有一些班級,每個班級裡有一些學生,現在每個班都會進行一場期末考試。給你乙個二維陣列classes
,其中classes[i] = [passi, totali]
,表示你提前知道了第i
個班級總共有totali
個學生,其中只有passi
個學生可以通過考試。
給你乙個整數extrastudents
,表示額外有extrastudents
個聰明的學生,他們一定能通過任何班級的期末考。你需要給這extrastudents
個學生每人都安排乙個班級,使得所有班級的平均通過率最大。
乙個班級的通過率等於這個班級通過考試的學生人數除以這個班級的總人數。平均通過率是所有班級的通過率之和除以班級數目。
請你返回在安排這extrastudents
個學生去對應班級後的最大平均通過率。與標準答案誤差範圍在10-5
以內的結果都會視為正確結果。
示例 1:
輸入:classes = [[1,2],[3,5],[2,2]], extrastudents = 2
輸出:0.78333
解釋:你可以將額外的兩個學生都安排到第乙個班級,平均通過率為 (3/4 + 3/5 + 2/2) / 3 = 0.78333 。
示例 2:
輸入:classes = [[2,4],[3,9],[4,5],[2,10]], extrastudents = 4
輸出:0.53485
解決方案:給第 \(i\) 個班級新增乙個聰明學生,其通過率的增量
\[\delta_i = \frac -\frac =\frac.
\]出於貪心,每分配乙個聰明學生,我們當然希望獲得的增量盡可能大。
於是可以將每個班級放入優先佇列,讓隊首元素的 \(\delta_i\) 最大。不斷為隊首班級分配聰明學生即可。
時間複雜度 \(o((n+extrastudents)\cdot \log n)\) ,其中 \(n\) 代表classes.length
。
struct node
};class solution );
}// 不斷為隊首班級分配聰明學生
while (extrastudents--)
// 計算最終平均通過率
double ans = 0;
while (!q.empty())
ans /= classes.size();
return ans;}};
給你乙個整數陣列nums
(下標從 0 開始)和乙個整數k
。
乙個子陣列(i, j)
的分數定義為min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1)
。乙個好子陣列的兩個端點下標需要滿足i <= k <= j
。
請你返回好子陣列的最大可能分數。
示例 1:
輸入:nums = [1,4,3,7,4,5], k = 3
輸出:15
解釋:最優子陣列的左右端點下標是 (1, 5) ,分數為 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15 。
示例 2:
輸入:nums = [5,5,4,5,4,1,1,1], k = 0
輸出:20
解釋:最優子陣列的左右端點下標是 (0, 4) ,分數為 min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20 。
解決方案:首先用線段樹或者 \(rmq\) 可快速查詢區間最小值。
注意到於是不妨
class rmq}}
int qmin(int l, int r)
ans = max(ans, val*(l-i+1));
}for (int j = k; j < nums.size(); ++j)
ans = max(ans, val*(j-l+1));
}return ans;}};
LeetCode第232場周賽
從4個方面考慮 s1 s2,直接true s1和s2裡只有乙個位置不同,返回false s1和s2裡有兩個位置不同,swap後,s1 s2,返回true s1和s2裡有多於兩個位置不同,swap後,不能保證s1 s2,返回false class solution int length s1.leng...
20210314 力扣第 232 場周賽
僅執行一次字串交換能否使兩個字串相等 找出星型圖的中心節點 最大平均通過率 好子陣列的最大分數 僅執行一次字串交換能否使兩個字串相等 翻譯題目即可 找出星型圖的中心節點 關鍵在於清楚這個中心點出現的次數剛好就是點數 1 最大平均通過率 優先佇列存所有的最大通過率,注意加乙個同學到乙個班裡的通過率提公...
leetcode 第132場周賽
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...