当前位置:实例文章 » 其他实例» [文章]Leetcode刷题4

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算法来解决这些问题,并提供示例代码和注释。

相关标签:python开发语言
其他信息

其他资源

Top