LeetCode 周赛 165周
LeetCode 周赛 165周 整理
这里对
LeetCode
165周的周赛, 进行整理.
- 注意所有的题目均来自 LeetCode,其中解题的算法,为参考人员的满分算法。(这里只是借鉴,学习,如有侵权请@我本人,本人会第一时间处理)
关于这份试题,我仍然会再出一份解析(不久的将来 )
第一题 井字棋
问题描述
A 和 B 在一个 3 x 3 的网格上玩井字棋。
井字棋游戏的规则如下:
- 玩家轮流将棋子放在空方格 (" ") 上。
- 第一个玩家 A 总是用 “X” 作为棋子,而第二个玩家 B 总是用 “O” 作为棋子。
“X” 和 “O” 只能放在空方格中,而不能放在已经被占用的方格上。 - 只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
- 如果所有方块都放满棋子(不为空),游戏也会结束。
- 游戏结束后,棋子无法再进行任何移动。
- 给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。
- 如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 “Draw”;如果仍会有行动(游戏未结束),则返回 “Pending”。
你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。
示例 1:
输入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
[X] [O] [N]
[N] [X] [N]
[N] [O] [X]
输出:“A”
解释:“A” 获胜,他总是先走。
"X " "X " "X " "X " "X "
" " -> " " -> " X " -> " X " -> " X "
" " "O " "O " "OO " “OOX”
示例 2:
输入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]
输出:“B”
解释:“B” 获胜。
"X " "X " "XX " “XXO” “XXO” “XXO”
" " -> " O " -> " O " -> " O " -> "XO " -> "XO "
" " " " " " " " " " "O "
示例 3:
输入:moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]]
输出:“Draw”
输出:由于没有办法再行动,游戏以平局结束。
“XXO”
“OOX”
“XOX”
示例 4:
输入:moves = [[0,0],[1,1]]
输出:“Pending”
解释:游戏还没有结束。
"X "
" O "
" "
提示:
- 1 <= moves.length <= 9
- moves[i].length == 2
- 0 <= moves[i][j] <= 2
- moves 里没有重复的元素。
- moves 遵循井字棋的规则。
参考代码
class Solution(object):
def tictactoe(self, moves: list[list[int]]) - > str:
"""
: type moves : list[list[int]]
: rtype : str
"""
self._rows = [[0,0] for _ in range(3)]
self._cols = [[0,0] for _ in range(3)]
self._diagonal = [0,0]
self._anti_diagonal = [0,0]
for idx, (row, col) in enumerate(moves):
i = idx & 1
self._rows[row][i] += 1
self._cols[col][i] += 1
if row == col:
self._diagonal[i] += 1
if col == len(self._rows) - row - 1:
self._anti_diagonal[i] += 1
if any([self._rows[row][i] == 3, self._cols[col][i] == 3, self._diagonal[i] == 3, self._anti_diagonal[i] == 3]):
return 'A' if i == 0 else 'B'
rturn 'Pending' if len(moves) < 9 else 'Draw'
if __name__ == '__main__':
moves[[0,0],[2,0],[1,1],[2,1],[2,2]]
print(Solution().tictactoe(moves))
第二题 分配优化问题(番茄 和 奶酪)
问题描述
圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。
给你两个整数 tomatoSlices 和 cheeseSlices,分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下:
巨无霸汉堡:4 片番茄和 1 片奶酪
小皇堡:2 片番茄和 1 片奶酪
请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。
如果无法使剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量为 0,就请返回 []。
示例 1:
输入:tomatoSlices = 16, cheeseSlices = 7
输出:[1,6]
解释:制作 1 个巨无霸汉堡和 6 个小皇堡需要 41 + 26 = 16 片番茄和 1 + 6 = 7 片奶酪。不会剩下原料。
示例 2:
输入:tomatoSlices = 17, cheeseSlices = 4
输出:[]
解释:只制作小皇堡和巨无霸汉堡无法用光全部原料。
示例 3:
输入:tomatoSlices = 4, cheeseSlices = 17
输出:[]
解释:制作 1 个巨无霸汉堡会剩下 16 片奶酪,制作 2 个小皇堡会剩下 15 片奶酪。
示例 4:
输入:tomatoSlices = 0, cheeseSlices = 0
输出:[0,0]
示例 5:
输入:tomatoSlices = 2, cheeseSlices = 1
输出:[0,1]
提示:
- 0 <= tomatoSlices <= 10^7
- 0 <= cheeseSlices <= 10^7
参考代码
ass Solution(object):
def numOfBurgers(self, tomatoSlices:int, cheeseSlices : int) -> list[int]:
"""
:type tomatoSlices: int
:type cheeseSlices: int
:rtype: List[int]
"""
a = tomatoSlices
b = cheeseSlices
if a % 2 !=0:
return []
j = a/2-b
x = 2*b-a/2
if x>=0 and j>=0:
return [j,x]
return []
第三题 矩阵
问题描述
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
示例 1:
输入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.
示例 2:
输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.
提示:
- 1 <= arr.length <= 300
- 1 <= arr[0].length <= 300
- 0 <= arr[i][j] <= 1
参考代码
class Solution(object):
def countSquares(self, matrix):
if not matrix or not matrix[0]: return 0
m, n = len(matrix), len(matrix[0])
dp = [[0 for _ in range(n)] for _ in range(m)]
res = 0
for i in range(m):
for j in range(n):
if (i == 0 or j == 0) and matrix[i][j] == 1:
dp[i][j] = 1
elif matrix[i][j] == 1:
dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i][j - 1])) + 1
res += dp[i][j]
return res
第四题 字符串相关
问题描述
给你一个由小写字母组成的字符串 s,和一个整数 k。
请你按下面的要求分割字符串:
首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。
请返回以这种方式分割字符串所需修改的最少字符数。
示例 1:
输入:s = “abc”, k = 2
输出:1
解释:你可以把字符串分割成 “ab” 和 “c”,并修改 “ab” 中的 1 个字符,将它变成回文串。
示例 2:
输入:s = “aabbc”, k = 3
输出:0
解释:你可以把字符串分割成 “aa”、“bb” 和 “c”,它们都是回文串。
示例 3:
输入:s = “leetcode”, k = 8
输出:0
提示:
- 1 <= k <= s.length <= 100
- s 中只含有小写英文字母。
参考代码
class Solution(object):
def palindromePartition(self, s, k):
size = len(s)
if size < 2: return 0
dp = [[float('inf')] * (size) for _ in range(size)]
for i in range(size):
dp[i][i] = 0
for j in range(i-1, -1, -1):
if s[i] == s[j]:
dp[j][i] = dp[j+1][i-1] if i - j > 1 else 0
else:
dp[j][i] = dp[j+1][i-1] + 1 if i - j > 1 else 1
res = [dp[0][i] for i in range(size)]
for _ in range(k-1):
nres = [x for x in res]
for j in range(size):
for right in range(j):
nres[j] = min(nres[j], res[right] + dp[right+1][j])
res = [x for x in nres]
return res[-1]
来源:CSDN
作者:Ispriatiom_H
链接:https://blog.csdn.net/Ispriatiom_H/article/details/103556391