【周赛总结】18-周赛353
发布人:shili8
发布时间:2024-10-15 11:03
阅读次数:0
**周赛总结**
**第353 周**
本周的周赛结束了,我们总结一下这周的比赛情况。
**题目概述**
本周共有10 道题,涵盖了算法、数据结构、数学等多个领域。其中,有几道题是比较经典的题目,如 "最长上升子序列" 和 "二叉搜索树的最大深度" 等。
**我的解决方案**
下面是我的解决方案:
###1. 最长上升子序列这个问题要求我们找出一个给定数组中最长的上升子序列。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最长上升子序列的长度。
def longest_ascending_sequence(nums): if not nums: return0 n = len(nums) dp = [1] * n for i in range(1, n): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] +1) return max(dp)
###2. 二叉搜索树的最大深度这个问题要求我们找出一个二叉搜索树的最大深度。我的解决方案是使用递归法,计算每个结点的左子树和右子树的高度,然后返回两者之和加一。
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Nonedef maxDepth(root): if not root: return0 left_height = maxDepth(root.left) right_height = maxDepth(root.right) return max(left_height, right_height) +1
###3. 最小基因变化这个问题要求我们找出两个给定字符串之间的最小基因变化。我的解决方案是使用动态规划法,维护一个长度为 m+n 的数组 dp,其中 dp[i][j] 表示第 i 个元素和第 j 个元素之间的最小基因变化。
def minMutation(start, end, bank): if not start or not end: return [] n = len(start) m = len(end) k = len(bank) dp = [[0] * (m +1) for _ in range(n +1)] for i in range(1, n +1): for j in range(1, m +1): if start[i -1] == end[j -1]: dp[i][j] =0 else: dp[i][j] = float('inf') for i in range(1, n +1): for j in range(1, m +1): if start[i -1] != end[j -1]: dp[i][j] = min(dp[i -1][j], dp[i][j -1]) +1 return dp[n][m]
###4. 最大正方形这个问题要求我们找出一个给定矩阵中最大的正方形。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示第 i 行的最大正方形。
def maximalSquare(matrix): if not matrix: return0 n = len(matrix) for i in range(1, n): for j in range(1, n): if matrix[i][j] == '1': dp[i] = max(dp[i], dp[i -1] +1) return dp[n -1]
###5. 最长回文子序列这个问题要求我们找出一个给定字符串中最长的回文子序列。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示第 i 个元素结尾的最长回文子序列。
def longestPalindromicSubsequence(s): if not s: return0 n = len(s) for i in range(n -1, -1, -1): dp[i] =1 for i in range(1, n): for j in range(i): if s[i] == s[j]: dp[i] = max(dp[i], dp[j] +2) return max(dp)
###6. 最小覆盖子集这个问题要求我们找出一个给定集合中最小的覆盖子集。我的解决方案是使用贪婪法,选择每次覆盖最多元素的子集。
def smallestCoveringSubset(nums): if not nums: return [] n = len(nums) dp = [0] * (1 << n) for i in range(1,1 << n): for j in range(n): if (i >> j) &1: dp[i] = max(dp[i], dp[i ^ (1 << j)] + nums[j]) return [nums[i] for i in range(n) if (1 << i) == dp[-1]]
###7. 最大子矩阵这个问题要求我们找出一个给定矩阵中最大子矩阵。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示第 i 行的最大子矩阵。
def maximalSubmatrix(matrix): if not matrix: return0 n = len(matrix) for i in range(1, n): for j in range(i): if matrix[i][j] == '1': dp[i] = max(dp[i], dp[j] +1) return dp[n -1]
###8. 最小基因变化这个问题要求我们找出两个给定字符串之间的最小基因变化。我的解决方案是使用动态规划法,维护一个长度为 m+n 的数组 dp,其中 dp[i][j] 表示第 i 个元素和第 j 个元素之间的最小基因变化。
def minMutation(start, end, bank): if not start or not end: return [] n = len(start) m = len(end) k = len(bank) dp = [[0] * (m +1) for _ in range(n +1)] for i in range(1, n +1): for j in range(1, m +1): if start[i -1] == end[j -1]: dp[i][j] =0 else: dp[i][j] = float('inf') for i in range(1, n +1): for j in range(1, m +1): if start[i -1] != end[j -1]: dp[i][j] = min(dp[i -1][j], dp[i][j -1]) +1 return dp[n][m]
###9. 最大正方形这个问题要求我们找出一个给定矩阵中最大的正方形。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示第 i 行的最大正方形。
def maximalSquare(matrix): if not matrix: return0 n = len(matrix) for i in range(1, n): for j in range(i): if matrix[i][j] == '1': dp[i] = max(dp[i], dp[j] +1) return dp[n -1]
###10. 最长回文子序列这个问题要求我们找出一个给定字符串中最长的回文子序列。我的解决方案是使用动态规划法,维护一个长度为 n 的数组 dp,其中 dp[i] 表示第 i 个元素结尾的最长回文子序列。
def longestPalindromicSubsequence(s): if not s: return0 n = len(s) for i in range(n -1, -1, -1): dp[i] =1 for i in range(1, n): for j in range(i): if s[i] == s[j]: dp[i] = max(dp[i], dp[j] +2) return max(dp)
**总结**
本周的周赛结束了,我们总结一下这周的比赛情况。我的解决方案涵盖了算法、数据结构和贪婪法等多个方面。希望这些解决方案能够帮助大家提高编程能力。
**参考