LeetCode 周赛 165周

时光怂恿深爱的人放手 提交于 2019-12-17 02:55:31

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]
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!