LeetCode——1900. 最佳运动员的比拼回合[The Earliest and Latest Rounds Where Players Compete][困难]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 记忆化搜索
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

n 名运动员参与一场锦标赛,所有运动员站成一排,并根据 最开始的 站位从 1 到 n 编号(运动员 1 是这一排中的第一个运动员,运动员 2 是第二个运动员,依此类推)。

锦标赛由多个回合组成(从回合 1 开始)。每一回合中,这一排从前往后数的第 i 名运动员需要与从后往前数的第 i 名运动员比拼,获胜者将会进入下一回合。如果当前回合中运动员数目为奇数,那么中间那位运动员将轮空晋级下一回合。

  • 例如,当前回合中,运动员 1, 2, 4, 6, 7 站成一排

    • 运动员 1 需要和运动员 7 比拼
    • 运动员 2 需要和运动员 6 比拼
    • 运动员 4 轮空晋级下一回合

每回合结束后,获胜者将会基于最开始分配给他们的原始顺序(升序)重新排成一排。

编号为 firstPlayer 和 secondPlayer 的运动员是本场锦标赛中的最佳运动员。在他们开始比拼之前,完全可以战胜任何其他运动员。而任意两个其他运动员进行比拼时,其中任意一个都有获胜的可能,因此你可以 裁定 谁是这一回合的获胜者。

给你三个整数 n、firstPlayer 和 secondPlayer 。返回一个由两个值组成的整数数组,分别表示两位最佳运动员在本场锦标赛中比拼的 最早 回合数和 最晚 回合数。

示例 1:

输入:n = 11, firstPlayer = 2, secondPlayer = 4
输出:[3,4]
解释:
一种能够产生最早回合数的情景是:
回合 1:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
回合 2:2, 3, 4, 5, 6, 11
回合 3:2, 3, 4
一种能够产生最晚回合数的情景是:
回合 1:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
回合 2:1, 2, 3, 4, 5, 6
回合 3:1, 2, 4
回合 4:2, 4

示例 2:

输入:n = 5, firstPlayer = 1, secondPlayer = 5
输出:[1,1]
解释:两名最佳运动员 1 和 5 将会在回合 1 进行比拼。
不存在使他们在其他回合进行比拼的可能。

提示:

  • 2 <= n <= 28
  • 1 <= firstPlayer < secondPlayer <= n

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/the-earliest-and-latest-rounds-where-players-compete
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 记忆化搜索

(1)思路

本题分析过程较复杂,官方题解写得很好,可参考:最佳运动员的比拼回合。

(2)代码

class Solution {int[][][] minRound, maxRound;//记忆化public int[] earliestAndLatest(int n, int firstPlayer, int secondPlayer) {this.minRound = new int[n + 1][n + 1][n + 1];this.maxRound = new int[n + 1][n + 1][n + 1];if (firstPlayer < secondPlayer)//调整使搜索时保持s<f,简化代码return dp(n, firstPlayer, secondPlayer);return dp(n, secondPlayer, firstPlayer);}public int[] dp(int n, int f, int s) {if (minRound[n][f][s] > 0)//已记忆化return new int[]{minRound[n][f][s], maxRound[n][f][s]};if (f + s == n + 1)//最后一回合,f和s比拼return new int[]{1, 1};if (f + s > n + 1) {//调整使搜索时保持s<f,简化代码int[] res = dp(n, n + 1 - s, n + 1 - f);minRound[n][f][s] = res[0];maxRound[n][f][s] = res[1];return res;}int minRes = Integer.MAX_VALUE, maxRes = Integer.MIN_VALUE;//当前情况下最小、最大回合计算结果int half = (n + 1) >> 1;//中间值,下一回合人数if (s <= half) {//s在左侧或中间for (int i = 0; i < f; i++) {//f左侧人数for (int j = 0; j < s - f; j++) {//f和s之间的人数int[] res = dp(half, i + 1, i + j + 2);//状态转移minRes = Math.min(minRes, res[0] + 1);maxRes = Math.max(maxRes, res[1] + 1);}}} else {//s在右侧for (int i = 0; i < f; i++) {//f左侧人数for (int j = 0; j < n + 1 - s - f; j++) {//f和s'之间的人数int[] res = dp(half, i + 1, i + j + 2 + (s * 2 - n - 1) / 2);//状态转移minRes = Math.min(minRes, res[0] + 1);maxRes = Math.max(maxRes, res[1] + 1);}}}minRound[n][f][s] = minRes;//记忆化maxRound[n][f][s] = maxRes;//记忆化return new int[]{minRes, maxRes};}
}

(3)结果

执行用时 :4 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :38.8 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)

三、其他

暂无。

LeetCode——1900. 最佳运动员的比拼回合(The Earliest and Latest Rounds Where Players Compete)[困难]——分析及代码(Java)相关推荐

  1. LeetCode——1736. 替换隐藏数字得到的最晚时间(Latest Time by Replacing Hidden Digits)——分析及代码(Java)

    LeetCode--1736. 替换隐藏数字得到的最晚时间[Latest Time by Replacing Hidden Digits]--分析及代码[Java] 一.题目 二.分析及代码 1. 逐 ...

  2. LeetCode——218. 天际线问题(The Skyline Problem)[困难]——分析及代码(Java)

    LeetCode--218. 天际线问题[The Skyline Problem][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 扫描线 + 优先队列 (1)思路 (2)代码 (3 ...

  3. LeetCode——552. 学生出勤记录 II(Student Attendance Record II)[困难]——分析及代码(Java)

    LeetCode--552. 学生出勤记录 II[Student Attendance Record II][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 ( ...

  4. LeetCode——787. K 站中转内最便宜的航班(Cheapest Flights Within K Stops)[中等]——分析及代码(Java)

    LeetCode--787. K 站中转内最便宜的航班[Cheapest Flights Within K Stops][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 ( ...

  5. LeetCode——1803. 统计异或值在范围内的数对有多少(Count Pairs With XOR in a Range)[困难]——分析及代码(Java)

    LeetCode--1803. 统计异或值在范围内的数对有多少[Count Pairs With XOR in a Range][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 暴力 ...

  6. LeetCode——517. 超级洗衣机(Super Washing Machines)[困难]——分析及代码(C++)

    LeetCode--517. 超级洗衣机[Super Washing Machines][困难]--分析及代码[C++] 一.题目 二.分析及代码 1. 贪心 (1)思路 (2)代码 (3)结果 三. ...

  7. LeetCode——1737. 满足三条件之一需改变的最少字符数(Change Minimum Characters to Satisfy One of Three...)——分析及代码(Java)

    LeetCode--1737. 满足三条件之一需改变的最少字符数[Change Minimum Characters to Satisfy One of Three Conditions]--分析及代 ...

  8. LeetCode——909. 蛇梯棋(Snakes and Ladders)[中等]——分析及代码(Java)

    LeetCode--909. 蛇梯棋[Snakes and Ladders][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 广度优先搜索 (1)思路 (2)代码 (3)结果 三.其 ...

  9. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)

    LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...

  10. LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)

    LeetCode--1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等 ...

最新文章

  1. 【深度学习入门到精通系列】医学图像预处理—灰度转换代码(G通道)
  2. hdu 1575Tr A
  3. join orcl的left_oracle中left join与where
  4. php 即时到账,paypal即时到账php实现代码
  5. Java Experiment 3 PairProgramming
  6. 浮动在IE6,7下的一些问题
  7. mysql 安装1364_安装完MySQL,在配置最后一步报错error Nr.1364
  8. Eclipse: Difference between clean, build and publish
  9. Linux(CentOS6.5)修改默认yum源为国内的阿里云、网易yum源
  10. 解决jz2440不能ping同主机问题
  11. 常见的MySQL命令大全
  12. 在微信小程序中绘制图表(part1)
  13. 服务器群晖系统安装,使用电脑为群晖NAS安装DSM操作系统
  14. Python菜鸟起飞day2--数据类型(元组,字典,字符串)
  15. 更改Windows的鼠标滚动方式为Mac方式(win鼠标滚轮反向)
  16. Huffman实现对26个英文字母的编码
  17. [Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下
  18. 吉比特2018校招 走格子游戏
  19. https://github.com/liuyi01/kubernetes-starterhttps://github.com/liuyi01/kubernetes-starter
  20. alpha测试什么意思,和Beta测试有何区别?

热门文章

  1. js——行间样式与非行间样式
  2. 鸟哥惠新宸:PHP 7.1 的新特性我并不是很喜欢
  3. 二维码扫描枪为何在商超店铺中受到欢迎呢?
  4. 计算机串口如何应用程序,串口通信调试软件的功能与使用方法 - 全文
  5. Prophet文档中文翻译--outliers
  6. 【gloomyfish】数据分析之 – 离群值(Outliers) BoxPlot
  7. 推荐系统中的bais系统(二)—Select Bais和Exposure Bias
  8. Excel去除含有重复数据所在行
  9. python web 数据可视化框架_利用django框架,手把手教你搭建数据可视化系统(一)...
  10. 简单制作一个百度注册页面