LeetCode1275
目次
- 题目形貌
- 示例
- 思路分析
- 代码段
- 代码逐行讲解
- 复杂度分析
- 总结的知识点
- 整合
- 总结
题目形貌
给定一个 3x3 的井字棋棋盘,moves 数组表示玩家的落子次序,其中 moves = [row, col] 表示第 i 步落子的位置。玩家 A 先手,玩家 B 后手。你必要根据 moves 判断游戏的胜负环境。
返回值:
- 如果玩家 A 得胜,返回 "A"
。
- 如果玩家 B 得胜,返回 "B"
。
- 如果游戏未竣事且没有玩家得胜,返回 "
ending"。
- 如果游戏竣事且没有玩家得胜,返回 "Draw"
。
示例
示例 1
输入:
- moves = [[0, 0], [2, 0], [1, 1], [2, 1], [2, 2]]
复制代码 输出:
解释:
示例 2
输入:
- moves = [[0, 0], [1, 1], [0, 1], [0, 2], [1, 0], [2, 0]]
复制代码 输出:
解释:
示例 3
输入:
- moves = [[0, 0], [1, 1], [2, 0], [1, 0], [1, 2], [2, 1], [0, 1], [0, 2], [2, 2]]
复制代码 输出:
解释:
思路分析
题目核心
我们必要根据玩家的落子次序,判断游戏的胜负环境。
思路拆解
- 查抄末了一步:
- 统计落子环境:
- 统计末了一步落子的玩家在行、列、对角线上的落子数量。
- 判断胜负:
- 判断游戏状态:
- 如果全部步数已满且没有玩家得胜,则返回 "Draw"
。
- 如果步数未满且没有玩家得胜,则返回 "
ending"。
代码段
- class Solution { public String tictactoe(int[][] moves) { int len = moves.length; int[] dp = moves[len - 1]; int x = 0, y = 0, x_y = 0, y_x = 0;
- int count = len - 1; while (count >= 0) { int[] cur = moves[count]; if (cur[1] == dp[1]) x++; if (cur[0] == dp[0]) y++; if (cur[0] == cur[1]) x_y++; if (cur[0] + cur[1] == 2) y_x++; count -= 2; } if (x >= 3 || y >= 3 || x_y >= 3 || y_x >= 3) { return len % 2 == 0 ? "B"
- : "A"
- ; } if (len < 9) return "Pending"; return "Draw"
- ; }}
复制代码
代码逐行讲解
- 获取步数和末了一步:
- int len = moves.length;
- int[] dp = moves[len - 1];
复制代码
- 初始化统计变量:
- int x = 0, y = 0, x_y = 0, y_x = 0;
复制代码
- x 统计列方向的落子数量。
- y 统计行方向的落子数量。
- x_y 统计主对角线方向的落子数量。
- y_x 统计副对角线方向的落子数量。
- 统计落子环境:
- int count = len - 1;
- while (count >= 0) {
- int[] cur = moves[count];
- if (cur[1] == dp[1]) x++;
- if (cur[0] == dp[0]) y++;
- if (cur[0] == cur[1]) x_y++;
- if (cur[0] + cur[1] == 2) y_x++;
- count -= 2;
- }
复制代码
- 判断胜负:
- if (x >= 3 || y >= 3 || x_y >= 3 || y_x >= 3) { return len % 2 == 0 ? "B"
- : "A"
- ;}
复制代码
- 如果某个方向上的落子数量达到 3,则返回得胜玩家。
- 判断游戏状态:
- if (len < 9) return "Pending";return "Draw"
- ;
复制代码
- 如果步数未满且没有玩家得胜,则返回 "
ending"。
- 如果步数已满且没有玩家得胜,则返回 "Draw"
。
复杂度分析
时间复杂度
- 遍历步数的时间复杂度为 O(n/2),其中 n 是步数。
- 因此,总时间复杂度为 O(n)。
空间复杂度
- 只使用了常数级别的额外空间,因此空间复杂度为 O(1)。
总结的知识点
整合
- class Solution { public String tictactoe(int[][] moves) { int len = moves.length; int[] dp = moves[len - 1]; int x = 0, y = 0, x_y = 0, y_x = 0;
- int count = len - 1; while (count >= 0) { int[] cur = moves[count]; if (cur[1] == dp[1]) x++; if (cur[0] == dp[0]) y++; if (cur[0] == cur[1]) x_y++; if (cur[0] + cur[1] == 2) y_x++; count -= 2; } if (x >= 3 || y >= 3 || x_y >= 3 || y_x >= 3) { return len % 2 == 0 ? "B"
- : "A"
- ; } if (len < 9) return "Pending"; return "Draw"
- ; }}
复制代码 总结
通过遍历和统计,能够高效地判断井字棋游戏的胜负环境。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |