IOS 算法(基礎(chǔ)篇) ----- 比賽中的配對(duì)次數(shù)

給你一個(gè)整數(shù) n ,表示比賽中的隊(duì)伍數(shù)。比賽遵循一種獨(dú)特的賽制:
如果當(dāng)前隊(duì)伍數(shù)是 偶數(shù) ,那么每支隊(duì)伍都會(huì)與另一支隊(duì)伍配對(duì)??偣策M(jìn)行 n / 2 場(chǎng)比賽,且產(chǎn)生 n / 2 支隊(duì)伍進(jìn)入下一輪。
如果當(dāng)前隊(duì)伍數(shù)為 奇數(shù) ,那么將會(huì)隨機(jī)輪空并晉級(jí)一支隊(duì)伍,其余的隊(duì)伍配對(duì)??偣策M(jìn)行 (n - 1) / 2 場(chǎng)比賽,且產(chǎn)生 (n - 1) / 2 + 1 支隊(duì)伍進(jìn)入下一輪。
返回在比賽中進(jìn)行的配對(duì)次數(shù),直到?jīng)Q出獲勝隊(duì)伍為止。

類似這種


vs

輸入:n = 7
輸出:6

第 1 輪:隊(duì)伍數(shù) = 7 ,配對(duì)次數(shù) = 3 ,4 支隊(duì)伍晉級(jí)。
第 2 輪:隊(duì)伍數(shù) = 4 ,配對(duì)次數(shù) = 2 ,2 支隊(duì)伍晉級(jí)。
第 3 輪:隊(duì)伍數(shù) = 2 ,配對(duì)次數(shù) = 1 ,決出 1 支獲勝隊(duì)伍。
總配對(duì)次數(shù) = 3 + 2 + 1 = 6

輸入:n = 14
輸出:13

第 1 輪:隊(duì)伍數(shù) = 14 ,配對(duì)次數(shù) = 7 ,7 支隊(duì)伍晉級(jí)。
第 2 輪:隊(duì)伍數(shù) = 7 ,配對(duì)次數(shù) = 3 ,4 支隊(duì)伍晉級(jí)。
第 3 輪:隊(duì)伍數(shù) = 4 ,配對(duì)次數(shù) = 2 ,2 支隊(duì)伍晉級(jí)。
第 4 輪:隊(duì)伍數(shù) = 2 ,配對(duì)次數(shù) = 1 ,決出 1 支獲勝隊(duì)伍。
總配對(duì)次數(shù) = 7 + 3 + 2 + 1 = 13

方法1

第一種方法比較好理解, 也很簡(jiǎn)單, 一行代碼

一共參賽n個(gè)隊(duì)伍,只有一個(gè)冠軍,需要淘汰n-1個(gè)隊(duì)伍。
因?yàn)槊繄?chǎng)比賽淘汰一個(gè)隊(duì)伍,因此需要進(jìn)行了n-1場(chǎng)比賽, 所以共有n-1個(gè)配對(duì)。

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

方法2

這種方法就是對(duì)題意的機(jī)械翻譯
每一輪比賽場(chǎng)數(shù) temp / 2 (初始令 temp = n))
每一輪剩余隊(duì)伍 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 算法合集地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容