大家好,我是程序员吴师兄。
很多人刷题一段时间后会进入疲倦期,我建议不妨参加一下 LeetCode 的周赛调节一下心情,周赛总共有四题,一简单两中等一困难,难度逐级上升,难的真的很难,一个小时做不出来很正常,简单的有时候会让你怀疑是不是看错题目,即使你刚学习算法不久也能做出来。
今天就给大家分享一道 LeetCode 周赛的题目,希望能鼓励你开始周赛之旅。
比如说第 219 场周赛的第一题:
题目描述是这样子的(为了更友好的阅读体验,建议你一字不漏的阅读完题目)。
给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:
如果当前队伍数是偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2
场比赛,且产生 n / 2
支队伍进入下一轮。
如果当前队伍数为奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2
场比赛,且产生(n - 1) / 2 + 1
支队伍进入下一轮。
返回在比赛中进行的配对次数,直到决出获胜队伍为止。
示例 1:
输入:n = 7
输出:6
解释:比赛详情:
- 第 1 轮:队伍数 = 7 ,配对次数 = 3 ,4 支队伍晋级。
- 第 2 轮:队伍数 = 4 ,配对次数 = 2 ,2 支队伍晋级。
- 第 3 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 3 + 2 + 1 = 6
示例 2:
输入:n = 14
输出:13
解释:比赛详情:
- 第 1 轮:队伍数 = 14 ,配对次数 = 7 ,7 支队伍晋级。
- 第 2 轮:队伍数 = 7 ,配对次数 = 3 ,4 支队伍晋级。
- 第 3 轮:队伍数 = 4 ,配对次数 = 2 ,2 支队伍晋级。
- 第 4 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 7 + 3 + 2 + 1 = 13
题目挺好理解,解题也不难,有三种思考方向:
直接根据题意进行分类讨论,如果此时比赛队伍为偶数直接除 2 记录为比赛次数,晋级的队伍为n/2
,如果此时比赛队伍为奇数则先减一,让剩下的队伍配对,次数为(( n - 1 ) /2)
,晋级的队伍为n/2 + 1
。
class Solution {
public int numberOfMatches(int n) {
int res = 0;
while(n > 1){
if(n % 2==0){
n/=2;
res += n;
}else{
res += (( n - 1 ) /2);
n = n/2 + 1;
}
}
return res;
}
}
class Solution {
public:
int numberOfMatches(int n) {
if( n == 1) return 0;
return n/2 + numberOfMatches((n+1)/2);
}
};
冠军只有一个,意味着 n - 1 个队伍需要淘汰,而每场比赛只能淘汰一个队伍,换言之需要淘汰 n - 1 个队伍需要比赛 n - 1 次,所以,答案出来了,一行代码 AC。
class Solution {
public int numberOfMatches(int n) {
return n-1;
}
}
是不是感觉我上我也行,有兴趣的小伙伴不妨去参与一下,说不定能拿个奖~