IOS 算法(基础篇) ----- 比赛中的配对次数
2021-01-21 本文已影响0人
ShawnAlex
给你一个整数 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 算法合集地址