IOS 算法(基础篇) ----- 比赛中的配对次数

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

类似这种


IOS 算法(基础篇) ----- 比赛中的配对次数_第1张图片
vs

输入:n = 7
输出:6

第 1 轮:队伍数 = 7 ,配对次数 = 3 ,4 支队伍晋级。
第 2 轮:队伍数 = 4 ,配对次数 = 2 ,2 支队伍晋级。
第 3 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 3 + 2 + 1 = 6

输入: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个队伍,只有一个冠军,需要淘汰n-1个队伍。
因为每场比赛淘汰一个队伍,因此需要进行了n-1场比赛, 所以共有n-1个配对。

    func numberOfMatches(_ n: Int) -> Int {
        return n - 1
    }

方法2

这种方法就是对题意的机械翻译
每一轮比赛场数 temp / 2 (初始令 temp = n))
每一轮剩余队伍 temp / 2 + temp % 2

    func numberOfMatches(_ n: Int) -> Int {
        
        var result = 0, temp = n
        while(temp > 1) {
            result += temp / 2
            temp = temp / 2 + temp % 2
        }

        return result
        
    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

你可能感兴趣的:(IOS 算法(基础篇) ----- 比赛中的配对次数)