544. Output Contest Matches

Description

During the NBA playoffs, we always arrange the rather strong team to play with the rather weak team, like make the rank 1 team play with the rank nth team, which is a good strategy to make the contest more interesting. Now, you're given n teams, you need to output their final contest matches in the form of a string.

The n teams are given in the form of positive integers from 1 to n, which represents their initial rank. (Rank 1 is the strongest team and Rank n is the weakest team.) We'll use parentheses('(', ')') and commas(',') to represent the contest team pairing - parentheses('(' , ')') for pairing and commas(',') for partition. During the pairing process in each round, you always need to follow the strategy of making the rather strong one pair with the rather weak one.

Example 1:

Input: 2
Output: (1,2)
Explanation:
Initially, we have the team 1 and the team 2, placed like: 1,2.
Then we pair the team (1,2) together with '(', ')' and ',', which is the final answer.

Example 2:

Input: 4
Output: ((1,4),(2,3))
Explanation:
In the first round, we pair the team 1 and 4, the team 2 and 3 together, as we need to make the strong team and weak team together.
And we got (1,4),(2,3).
In the second round, the winners of (1,4) and (2,3) need to play again to generate the final winner, so you need to add the paratheses outside them.
And we got the final answer ((1,4),(2,3)).

Example 3:

Input: 8
Output: (((1,8),(4,5)),((2,7),(3,6)))
Explanation:
First round: (1,8),(2,7),(3,6),(4,5)
Second round: ((1,8),(4,5)),((2,7),(3,6))
Third round: (((1,8),(4,5)),((2,7),(3,6)))
Since the third round will generate the final winner, you need to output the answer (((1,8),(4,5)),((2,7),(3,6))).

Note:

  1. The n is in range [2, 212].
  2. We ensure that the input n can be converted into the form 2k, where k is a positive integer.

Solution

Simulation, O(n log n), S(n)

In each round, the i-th team becomes "(" + team[i] + "," + team[n-1-i] + ")", and then there are half as many teams.

class Solution {
    public String findContestMatch(int n) {
        List<String> curr = new ArrayList<>();
        for (int i = 1; i <= n; ++i) {
            curr.add(Integer.toString(i));
        }
        
        while (curr.size() > 1) {
            List<String> next = new ArrayList<>();
            
            for (int i = 0, j = curr.size() - 1; i < j; ++i, --j) {
                String pair = "(" + curr.get(i) + "," +  curr.get(j) + ")";
                next.add(pair);
            }
            
            curr = next;
        }
        
        return curr.get(0);
    }
}

Recursion + Math, O(n), S(n)

对于n = 8,来说,最终的数字序列一定是:{1, 8, 4, 5, 2, 7, 3, 6},数字之间是有规律的。
然后将(,)递归插入到数字序列中就可以了。
具体代码还没读懂TQT

class Solution {
    int[] team;
    int t;
    StringBuilder ans;
    
    public String findContestMatch(int n) {
        team = new int[n];
        t = 0;
        ans = new StringBuilder();
        write(n, Integer.numberOfTrailingZeros(n));
        return ans.toString();
    }

    public void write(int n, int round) {
        if (round == 0) {
            int w = Integer.lowestOneBit(t);
            team[t] = w > 0 ? n / w + 1 - team[t - w] : 1;
            ans.append("" + team[t++]);
        } else {
            ans.append("(");
            write(n, round - 1);
            ans.append(",");
            write(n, round - 1);
            ans.append(")");
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,167评论 0 10
  • 毕业后,谁还记得那年秋天, 第一次踏进校园的你; 遇见怎样的风景? 也许站在校门前高望着校名; 幻想今后在这一方土...
    今郴阅读 1,531评论 0 0
  • 01 前两天,我跟远方的妈妈通话,照常唠叨着家常琐碎。聊着聊着,很自然地提到我爸。 妈妈突然提高了声音:“你爸爸都...
    531_阅读 12,249评论 0 0
  • 战争题材片 剧情严密,细节突出 3d效果超级棒,电影道具精致逼真,人气链人物关系紧凑,场面大,惊心动破 演员演技...
    April_yang03阅读 1,733评论 0 0
  • 周末在家的日子基本是一觉睡到自然醒。这个周末也如往常一样,只是手机忘了调成飞行模式。 迷迷糊糊中手机就跟发疯了似的...
    李小灼阅读 4,079评论 4 9

友情链接更多精彩内容