美文网首页
IOS 算法(基础篇) ----- 比赛中的配对次数

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

作者: ShawnAlex | 来源:发表于2021-01-21 11:10 被阅读0次

    给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:
    如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
    如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 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 算法(基础篇) ----- 比赛中的配对次数

          本文链接:https://www.haomeiwen.com/subject/inprzktx.html