引言
在LeetCode的算法题库中,我们常常会遇到一些看似简单的题目,但实际上却蕴藏着一些值得深思的解题思路。今天我们要讨论的题目是2639. 查询网格图中每一列的宽度(Find the Width of Columns of a Grid),这道题目看似简单,但它却能让我们更深入地理解遍历、循环等基础算法的应用。
题目描述
给定一个大小为 m x n 的二维整数数组 grid。
你需要返回一个大小为 n 的整数数组 ans,其中 ans[i] 代表 grid 中第 i 列的宽度。
示例
输入:grid = [[1,2,3],[4,5,6],[7,8,9]]
输出:[3,3,3]
解释:grid 中每一列的宽度都是 3。
输入:grid = [[1,1,1,1],[2,2,2,2],[3,3,3,3]]
输出:[3,3,3,3]
解释:grid 中每一列的宽度都是 3。
解题思路
这道题目的核心在于理解二维数组的结构,并能够通过遍历的方式获取每一列的元素数量。我们可以采用以下两种方法来解决:
方法一:逐列遍历
1. 初始化一个大小为 n 的数组 ans,用来存放每一列的宽度。
2. 遍历 grid 数组,对于每一列 i,使用一个循环遍历该列的所有行,并统计该列的元素数量。
3. 将统计的元素数量赋值给 ans[i]。
4. 最后返回 ans 数组。
方法二:直接计算
1. 直接利用 grid 的行数作为每一列的宽度,因为每一列的元素数量都是相同的。
2. 初始化一个大小为 n 的数组 ans,并将所有元素都设置为 grid 的行数。
3. 返回 ans 数组。
代码实现
方法一:逐列遍历
python
class Solution:
def findColumnWidth(self, grid: List[List[int]]) -> List[int]:
m, n = len(grid), len(grid[0])
ans = [0] n
for i in range(n):
for j in range(m):
ans[i] += 1
return ans
方法二:直接计算
python
class Solution:
def findColumnWidth(self, grid: List[List[int]]) -> List[int]:
m, n = len(grid), len(grid[0])
ans = [m] n
return ans
性能分析
两种方法在时间复杂度和空间复杂度上都有区别:
| 方法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 方法一 | O(m n) | O(n) |
| 方法二 | O(n) | O(n) |
可以看到,方法二的时间复杂度更低,并且空间复杂度也更低。
表格对比
| 方法 | 代码实现 | 时间复杂度 | 空间复杂度 |
|---|---|---|---|
| 方法一 | 逐列遍历 | O(m n) | O(n) |
| 方法二 | 直接计算 | O(n) | O(n) |
总结
通过这道题目的解题过程,我们可以看到,即使是看似简单的题目,也蕴藏着不同的解题思路和性能差异。在实际应用中,我们需要根据具体的场景选择最优的解题方法,以提高代码的效率和可读性。
思考
这道题目也可以扩展到更复杂的情况,例如:
不同列的元素数量可能不同。
grid 数组可能为空,或者行数或列数为 0。
对于这些情况,我们需要在代码中添加相应的判断和处理逻辑,以确保代码的鲁棒性。
期待您的分享!
您是否还有其他解题思路?欢迎在评论区分享您的见解!

还没有评论,来说两句吧...