一道 LeetCode 周赛的题目,让我自信满满!

大家好,我是程序员吴师兄。

很多人刷题一段时间后会进入疲倦期,我建议不妨参加一下 LeetCode 的周赛调节一下心情,周赛总共有四题,一简单两中等一困难,难度逐级上升,难的真的很难,一个小时做不出来很正常,简单的有时候会让你怀疑是不是看错题目,即使你刚学习算法不久也能做出来。

今天就给大家分享一道 LeetCode 周赛的题目,希望能鼓励你开始周赛之旅。

比如说第 219 场周赛的第一题:

题目描述是这样子的(为了更友好的阅读体验,建议你一字不漏的阅读完题目)。

给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:

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

示例 1:

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

示例 2:

输入: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、按部就班法

直接根据题意进行分类讨论,如果此时比赛队伍为偶数直接除 2 记录为比赛次数,晋级的队伍为n/2 ,如果此时比赛队伍为奇数则先减一,让剩下的队伍配对,次数为(( n - 1 ) /2) ,晋级的队伍为n/2 + 1

class Solution {
    public int numberOfMatches(int n) {
        int res = 0;
        while(n > 1){
            if(n % 2==0){
                n/=2;
                res += n;
            }else{
                res += (( n - 1 ) /2);
                n = n/2 + 1;
            }
        }
        return res;
    }
}

2、无脑递归法

class Solution {
public:
    int numberOfMatches(int n) {
        if( n == 1) return 0;
        return n/2 + numberOfMatches((n+1)/2);
    }
};

3、不讲武德法

冠军只有一个,意味着 n - 1 个队伍需要淘汰,而每场比赛只能淘汰一个队伍,换言之需要淘汰 n - 1 个队伍需要比赛 n - 1 次,所以,答案出来了,一行代码 AC。

class Solution {
    public int numberOfMatches(int n) {
        return n-1;
    }
}

是不是感觉我上我也行,有兴趣的小伙伴不妨去参与一下,说不定能拿个奖~


猜你喜欢

转载自blog.csdn.net/kexuanxiu1163/article/details/112914181