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.lengthn == grid[i].length1 <= m, n <= 100-10^9 <= grid[r][c] <= 10^9
解题思路
这道题要求计算矩阵每列中数字的最大字符串长度。我们需要理解数字的字符串长度计算规则:对于正数,长度就是位数;对于负数,长度是位数加1(因为负号)。
解题思路:
- 遍历列:对于每一列,我们需要遍历该列的所有元素
- 计算数字长度:对于每个数字,计算其字符串表示的长度
- 维护最大值:在每列中维护最大的字符串长度
计算数字长度的方法:
- 方法一:直接转换为字符串,然后获取长度(推荐)
- 方法二:数学方法,通过除10计算位数,负数需要额外加1
算法步骤:
- 初始化结果数组,长度为列数n
- 对每一列j,遍历所有行i
- 计算grid[i][j]的字符串长度
- 更新该列的最大长度
- 返回结果数组
这个问题的核心在于正确计算数字的字符串长度,使用字符串转换是最直观和可靠的方法。
代码实现
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),用于存储结果数组 |