难度:简单
目录
一、问题描述
这里直接采用的是LeetCode上面的问题描述。
给你一个整数 n
,表示比赛中的队伍数。比赛遵循一种独特的赛制:
- 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
- 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。
返回在比赛中进行的配对次数,直到决出获胜队伍为止。
下面给出示例:
提示:
1 <= n <= 200
二、解题思想
经典的比赛问题,根据题目给出的赛制可以计算:
- 当比赛的人数是 偶数 时,那么会进行 场比赛,剩下 个队伍。
- 当比赛人数时 奇数 时,那么会进行 比赛,剩下个队伍。
进行循环,每次更新进行的比赛,更新剩下的队伍。最后累加每次进行的比赛即可,这里只要剩下的队伍不是 1 的话,那么就一直继续比赛。
测试数据比较多,发现规律了,还有一种更简单粗暴的方法即:
只要 队伍 >= 1 那么,就一定要进行 队伍-1 场比赛,因此可以直接 return 队伍-1 即可。
三、解题
1、判断极端情况
这一题没有什么极端情况,控制好循环停止的条件即可。
2、代码实现
class Solution {
public:
int numberOfMatches(int n) {
int ans = 0;
while(n != 1){
if(!(n%2)){
n /=2 ;
ans += n;
continue;
}
if(n%2){
ans += (n-1)/2;
n = (n-1)/2 + 1;
continue;
}
}
return ans;
}
};
也可以直接一点,简单粗暴:
class Solution {
public:
int numberOfMatches(int n) {
return n-1;
};
四、总结
简单来说,是一个数学问题。
如果对你有什么帮助,请star ♥ 一下,收藏一下,蟹蟹啦!👇👇