本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
今天的每日一题相对简单,算是给自己小小放个假。而且做完模拟去看题解得我,大为震惊。
每日一题
今天的每日一题为743. 网络延迟时间,难度为简单
给你一个整数 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
提示:
- 1 <= n <= 200
题解
模拟解法
今天的题目偏简单,按照正常的循环的思维去解题,我们只需要一直循环n,因为题目告诉我们最后只会有一只队伍胜出,所以我们就能够得出循环的条件是 n>1 ,只要剩下的队伍超过一只,循环就不会结束
然后,每次循环的时候,又根据队伍的数目分为偶数的情况和奇数的情况:
- 当剩余队伍为偶数的时候,就会进行 n/2 次的匹配,并且 n 也变为 n/2
- 当剩余队伍为奇数的时候,会进行 (n-1)/2 次匹配,并且 n 变为 (n-1)/2+1
这样一来,我们只要定义一个 匹配总数来保存匹配的次数,一直循环就可以了
/**
* @param {number} n
* @return {number}
*/
var numberOfMatches = function (n) {
let sum = 0
while (n > 1) {
if (n%2==1) {
sum+= (n-1) / 2
n = (n-1) / 2 + 1
}
if (n%2==0) {
sum+= n/2
n = n/2
}
}
return sum
};
数学解法
其实这道题,在每一场比赛当中,两只队伍决胜负后输的队伍就会被淘汰,并且,最后只剩下一只队伍,就是说每匹配一次就会有一只队伍被淘汰,那么最后只要剩下一只队伍,那就需要淘汰掉 n-1 只队伍,那么就需要匹配 n-1 次(仔细一想好像是这么个道理,就哪怕不看题目要求,就比如50只队伍比赛,那么最后就要比49场。。。)
/**
* @param {number} n
* @return {number}
*/
var numberOfMatches = function (n) {
return n-1
};
而且很让我奇怪的是为什么 return n-1 运行消耗竟然和模拟差不多。。。