1. 题意
求每一列中最长整数的长度。
2. 题解
2.1 直接模拟
class Solution {
public:
void test(int a1, int a2) {
if (a1 != a2)
printf("%d ne %d\n", a1, a2);
}
vector<int> findColumnWidth(vector<vector<int>>& grid) {
vector<int> ans(grid[0].size(), 0);
function<int(int)> p = [](int p)->int {
int cnt = 0;
if (p < 0)
cnt++;
if (p == 0)
cnt = 1;
while(p) {
cnt++;
p /= 10;
}
return cnt;
} ;
// test(p(-1),2);
// test(p(0),1);
// test(p(-23),3);
int r = grid.size();
int c = grid[0].size();
for (int i = 0;i < r; ++i) {
for (int j = 0;j < c; ++j) {
ans[j] = max(ans[j], p(grid[i][j]));
}
}
return ans;
}
};
2.2 优化
03xf
的题解。
就是先找到长度最长的数,
绝对值越大,数字越长。
不妨令 m x mx mx为一列中最大的数, m n mn mn为一列中最小的数。
对于负号,可以乘
−
10
-10
−10来消除。
m
a
x
=
max
(
m
x
,
−
10
×
m
n
)
max= \max( mx, -10\times mn)
max=max(mx,−10×mn)
但是这样会乘法溢出,所以一个巧妙的转换,取
m
x
/
10
mx/10
mx/10
m
a
x
=
max
(
m
x
/
10
,
−
m
n
)
max= \max(mx/10, -mn)
max=max(mx/10,−mn)
注意到这个式子对正数也适用
- 03xf
class Solution {
public:
vector<int> findColumnWidth(vector<vector<int>>& grid) {
int n = grid[0].size();
vector<int> ans(n);
for (int j = 0; j < n; j++) {
int mn = 0, mx = 0;
for (auto& row : grid) {
mn = min(mn, row[j]);
mx = max(mx, row[j]);
}
int len = 1;
for (int x = max(mx / 10, -mn); x; x /= 10) {
len++;
}
ans[j] = len;
}
return ans;
}
};
作者:灵茶山艾府
链接:https://leetcode.cn/problems/find-the-width-of-columns-of-a-grid/solutions/2229051/jian-ji-xie-fa-by-endlesscheng-xudg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 我的
class Solution {
public:
void test(int a1, int a2) {
if (a1 != a2)
printf("%d ne %d\n", a1, a2);
}
vector<int> findColumnWidth(vector<vector<int>>& grid) {
vector<int> ans(grid[0].size(), 0);
// test(p(-1),2);
// test(p(0),1);
// test(p(-23),3);
int r = grid.size();
int c = grid[0].size();
for (int i = 0;i < r; ++i) {
for (int j = 0;j < c; ++j) {
if ( grid[i][j] >= 0) {
ans[j] = max(grid[i][j]/10, ans[j]);
}
else {
ans[j] = max(grid[i][j] * -1, ans[j]);
}
}
}
for (auto &v: ans) {
int k = v;
int cnt =0;
while (k) {
k /= 10;
cnt ++;
}
v = cnt + 1;
}
return ans;
}
};