leetcode2639--查询网格图中每一列宽度

文章介绍了如何在LeetCode问题中计算矩阵格子中每列最长整数的宽度,提供了两种方法:直接模拟和优化后的版本,后者通过预处理最大值和最小值来避免乘法溢出,提高了效率。
摘要由CSDN通过智能技术生成

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值