Leetcode刷题4
发布人:shili8
发布时间:2025-02-05 08:53
阅读次数:0
**LeetCode刷题之四**
在前面的三篇文章中,我们已经介绍了如何刷LeetCode,包括选择合适的难度级别、使用正确的语言(Python或Java),以及如何编写高质量的代码。今天,我们将继续讨论一些更复杂的问题,并提供示例代码和注释。
###1. 最长公共子序列 (Longest Common Subsequence)
**问题描述**
给定两个字符串 `s1` 和 `s2`,找到它们之间最长公共子序列的长度。
**示例**
* 输入:`s1 = "AGGTAB"`, `s2 = "GXTXAYB"`
* 输出:`4`
**解决方案**
我们可以使用动态规划来解决这个问题。首先,我们定义一个二维数组 `dp`,其中 `dp[i][j]` 表示 `s1[0..i-1]` 和 `s2[0..j-1]` 之间最长公共子序列的长度。
def longestCommonSubsequence(s1, s2): m, n = len(s1), len(s2) # Initialize dp array dp = [[0] * (n +1) for _ in range(m +1)] # Fill dp array for i in range(1, m +1): for j in range(1, n +1): if s1[i -1] == s2[j -1]: dp[i][j] = dp[i -1][j -1] +1 else: dp[i][j] = max(dp[i -1][j], dp[i][j -1]) # Return the length of LCS return dp[m][n]
###2. 最小生成树 (Minimum Spanning Tree)
**问题描述**
给定一个带权图 `graph`,找到其最小生成树的总权重。
**示例**
* 输入:`graph = [[0,1,3], [1,0,5], [3,5,0]]`
* 输出:`6`
**解决方案**
我们可以使用 Prim 算法来找到最小生成树。首先,我们选择一个随机顶点作为起始点,并将其标记为已访问。
import heapqdef minSpanningTree(graph): m = len(graph) # Initialize distances array distances = [float('inf')] * m # Choose a random vertex as the starting point start_vertex =0 distances[start_vertex] =0 # Create a priority queue to store edges pq = [(0, start_vertex)] # Run Prim's algorithm while pq: _, u = heapq.heappop(pq) for v in range(m): if graph[u][v] !=0 and distances[v] > graph[u][v]: distances[v] = graph[u][v] heapq.heappush(pq, (distances[v], v)) # Return the total weight of MST return sum(distances)
###3. 最大子矩阵和 (Maximum Submatrix Sum)
**问题描述**
给定一个二维数组 `matrix`,找到其中最大子矩阵的总和。
**示例**
* 输入:`matrix = [[1,2, -1, -4, -20], [-8, -3,4,2,1], [3,8,10,1,3], [-4, -1,0,6, -5]]`
* 输出:`29`
**解决方案**
我们可以使用 Kadane 算法来找到最大子矩阵的总和。首先,我们定义一个一维数组 `prefix_sum`,其中 `prefix_sum[i]` 表示从第一行开始到第 `i` 行的前缀和。
def maxSubmatrixSum(matrix): m, n = len(matrix), len(matrix[0]) # Initialize prefix sum array prefix_sum = [0] * (m +1) # Run Kadane's algorithm for each column for j in range(n): for i in range(m): prefix_sum[i +1] += matrix[i][j] max_sum = float('-inf') current_sum =0 for i in range(m +1): current_sum += prefix_sum[i] if current_sum > max_sum: max_sum = current_sum # Update the maximum submatrix sum max_submatrix_sum = max(max_submatrix_sum, max_sum) return max_submatrix_sum
### 总结在本文中,我们讨论了三个更复杂的问题:最长公共子序列、最小生成树和最大子矩阵和。我们使用动态规划、Prim 算法和Kadane算法来解决这些问题,并提供示例代码和注释。