Easy

题目描述

给你一个下标从 0 开始、大小为 m x n 的整数矩阵 grid 。矩阵中某一列的宽度是这一列数字的最大字符串长度。

  • 举个例子,如果 grid = [[-10], [3], [12]] ,那么唯一一列的宽度是 3 ,因为 -10 的字符串长度为 3

返回一个大小为 n 的整数数组 ans ,其中 ans[i] 是第 i 列的宽度。

整数 x字符串长度 就是函数 len(str(x)) 的值。

示例 1:

输入:grid = [[1],[22],[333]]
输出:[3]
解释:第 0 列中,333 的字符串长度为 3 。

示例 2:

输入:grid = [[-15,1,3],[15,7,12],[5,6,-2]]
输出:[3,1,2]
解释:
第 0 列中,只有 -15 的字符串长度为 3 。
第 1 列中,所有整数的字符串长度都是 1 。 
第 2 列中,12 和 -2 的字符串长度都是 2 。

提示:

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

解题思路

这道题要求计算矩阵每列中数字的最大字符串长度。我们需要理解数字的字符串长度计算规则:对于正数,长度就是位数;对于负数,长度是位数加1(因为负号)。

解题思路:

  1. 遍历列:对于每一列,我们需要遍历该列的所有元素
  2. 计算数字长度:对于每个数字,计算其字符串表示的长度
  3. 维护最大值:在每列中维护最大的字符串长度

计算数字长度的方法:

  • 方法一:直接转换为字符串,然后获取长度(推荐)
  • 方法二:数学方法,通过除10计算位数,负数需要额外加1

算法步骤:

  1. 初始化结果数组,长度为列数n
  2. 对每一列j,遍历所有行i
  3. 计算grid[i][j]的字符串长度
  4. 更新该列的最大长度
  5. 返回结果数组

这个问题的核心在于正确计算数字的字符串长度,使用字符串转换是最直观和可靠的方法。

代码实现

class Solution {
public:
    vector<int> findColumnWidth(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        vector<int> result(n, 0);
        
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                int len = to_string(grid[i][j]).length();
                result[j] = max(result[j], len);
            }
        }
        
        return result;
    }
};
class Solution:
    def findColumnWidth(self, grid: List[List[int]]) -> List[int]:
        m, n = len(grid), len(grid[0])
        result = [0] * n
        
        for j in range(n):
            for i in range(m):
                length = len(str(grid[i][j]))
                result[j] = max(result[j], length)
        
        return result
public class Solution {
    public int[] FindColumnWidth(int[][] grid) {
        int m = grid.Length;
        int n = grid[0].Length;
        int[] result = new int[n];
        
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                int len = grid[i][j].ToString().Length;
                result[j] = Math.Max(result[j], len);
            }
        }
        
        return result;
    }
}
var findColumnWidth = function(grid) {
    const m = grid.length;
    const n = grid[0].length;
    const result = new Array(n).fill(0);
    
    for (let j = 0; j < n; j++) {
        for (let i = 0; i < m; i++) {
            const len = grid[i][j].toString().length;
            result[j] = Math.max(result[j], len);
        }
    }
    
    return result;
};

复杂度分析

复杂度类型分析
时间复杂度O(m × n × k),其中 m 是行数,n 是列数,k 是数字转字符串的平均长度
空间复杂度O(n),用于存储结果数组

相关题目