leetcode刷题记录-1688. 比赛中的配对次数

308 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

今天的每日一题相对简单,算是给自己小小放个假。而且做完模拟去看题解得我,大为震惊。

每日一题

今天的每日一题为743. 网络延迟时间,难度为简单
给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:

  • 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
  • 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。
  • 返回在比赛中进行的配对次数,直到决出获胜队伍为止。

 

示例 1:

输入:n = 7
输出:6
解释:比赛详情:
- 第 1 轮:队伍数 = 7 ,配对次数 = 34 支队伍晋级。
- 第 2 轮:队伍数 = 4 ,配对次数 = 22 支队伍晋级。
- 第 3 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 3 + 2 + 1 = 6

示例 2:

输入:n = 14
输出:13
解释:比赛详情:
- 第 1 轮:队伍数 = 14 ,配对次数 = 77 支队伍晋级。
- 第 2 轮:队伍数 = 7 ,配对次数 = 34 支队伍晋级。 
- 第 3 轮:队伍数 = 4 ,配对次数 = 22 支队伍晋级。
- 第 4 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 7 + 3 + 2 + 1 = 13

  提示:

  • 1 <= n <= 200

题解

模拟解法

今天的题目偏简单,按照正常的循环的思维去解题,我们只需要一直循环n,因为题目告诉我们最后只会有一只队伍胜出,所以我们就能够得出循环的条件是 n>1 ,只要剩下的队伍超过一只,循环就不会结束

然后,每次循环的时候,又根据队伍的数目分为偶数的情况和奇数的情况:

  1. 当剩余队伍为偶数的时候,就会进行 n/2 次的匹配,并且 n 也变为 n/2
  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 
};

image.png

数学解法

其实这道题,在每一场比赛当中,两只队伍决胜负后输的队伍就会被淘汰,并且,最后只剩下一只队伍,就是说每匹配一次就会有一只队伍被淘汰,那么最后只要剩下一只队伍,那就需要淘汰掉 n-1 只队伍,那么就需要匹配 n-1 次(仔细一想好像是这么个道理,就哪怕不看题目要求,就比如50只队伍比赛,那么最后就要比49场。。。)

/** 
* @param {number} n 
* @return {number} 
*/ 
var numberOfMatches = function (n) { 
    return n-1
};

image.png

而且很让我奇怪的是为什么 return n-1 运行消耗竟然和模拟差不多。。。