leetcode
leetcode 2251 ~ 2300
查询网格图中每一列的宽度

查询网格图中每一列的宽度

难度:

标签:

题目描述

You are given a 0-indexed m x n integer matrix grid. The width of a column is the maximum length of its integers.

  • For example, if grid = [[-10], [3], [12]], the width of the only column is 3 since -10 is of length 3.

Return an integer array ans of size n where ans[i] is the width of the ith column.

The length of an integer x with len digits is equal to len if x is non-negative, and len + 1 otherwise.

 

Example 1:

Input: grid = [[1],[22],[333]]
Output: [3]
Explanation: In the 0th column, 333 is of length 3.

Example 2:

Input: grid = [[-15,1,3],[15,7,12],[5,6,-2]]
Output: [3,1,2]
Explanation: 
In the 0th column, only -15 is of length 3.
In the 1st column, all integers are of length 1. 
In the 2nd column, both 12 and -2 are of length 2.

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 100
  • -109 <= grid[r][c] <= 109

代码结果

运行时间: 31 ms, 内存: 17.3 MB


/* 思路:
   使用 Java Stream API 简化代码,
   1. 对于每一列,计算每个元素的字符串长度。
   2. 找到最大字符串长度,并存入结果数组。 */

import java.util.Arrays;

public class Solution {
    public int[] findColumnWidth(int[][] grid) {
        return Arrays.stream(grid[0]) // 从第一行开始
                     .mapToInt((v, j) -> Arrays.stream(grid) // 遍历每一列
                                           .mapToInt(row -> String.valueOf(row[j]).length()) // 获取每个元素的字符串长度
                                           .max().orElse(0)) // 找到该列的最大长度
                     .toArray(); // 转换为数组返回
    }
}

解释

方法:

此题解通过遍历矩阵中的每一列,对于每列中的每个元素,将其转换为字符串并计算字符串的长度。通过在内部循环中维护一个变量tmp,记录当前列中最大的字符串长度。最后,将每列的最大长度存储到结果列表中并返回。

时间复杂度:

O(m*n)

空间复杂度:

O(n)

代码细节讲解

🦆
题解中提到`tmp = max(tmp, len(str(grid[i][j])))`计算字符串长度,为何不直接使用`str(abs(grid[i][j]))`来忽略负号,是否有考虑到负数长度的影响?
在题解中不使用`str(abs(grid[i][j]))`来忽略负号,是因为在计算列宽度时,负号是整个数字表示的一部分,应被考虑在内。如果列中包含负数,负号也会占用字符空间,从而影响宽度的计算。正确反映每个元素的实际宽度可以确保列宽度足够以展示所有元素,包括负号。
🦆
题解中没有提及如何处理空矩阵或极端情况下的输入,如`grid=[]`或`grid=[[]]`,解决方案中是否应该包含对这些情况的处理?
确实,题解中未说明如何处理空矩阵或空行的情况。理想的解决方案应该包括对这些边缘情况的检查。例如,可以在函数开始时添加一段代码来检查`grid`是否为空或首行是否为空,如果是,则直接返回一个空列表。这样可以避免运行时错误,并确保函数在任何输入下都能稳定运行。
🦆
在题解的逻辑中,内循环遍历每列的所有元素来找最大宽度,是否有其他数据结构或方法可以减少遍历次数或提高效率?
当前算法已经是在不改变数据输入结构的情况下,针对问题的直接解法。由于需要确定每一列的最大宽度,我们必须检查该列的每个元素,因此每个元素至少被访问一次。在这种情况下,算法的时间复杂度基本上是最优的。如果矩阵的存储或访问方式有更高效的结构(例如,如果数据以列为主的格式存储),可能会进一步优化访问速度,但这超出了常规二维数组的处理范畴。
🦆
题解提出的算法适用于任何大小的矩阵,但是否有必要对矩阵尺寸进行限制,以防止在极大矩阵上的性能问题?
在实际应用中,确实应当考虑到矩阵的尺寸,因为极大的数据输入会导致显著的性能下降,特别是在内存使用和处理时间上。在实现算法时,可以设定一些合理的限制,如矩阵的最大行数和列数,以确保程序可以在合理的时间内完成运算。这种做法可以在文档中明确说明,或者在代码中通过异常处理来实施,以便于用户理解可能的性能风险。

相关问题