算法题笔记 - 598

总结:

lamda函数可以改善代码可读性,但是效率存疑。

 

 

给定一个初始元素全部为 0,大小为 m*n 的矩阵 以及在 上的一系列更新操作。

操作用二维数组表示,其中的每个操作用一个含有两个正整数 ab 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1

在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

示例 1:

输入: 
m = 3, n = 3
operations = [[2,2],[3,3]]
输出: 4
解释: 
初始状态, M = 
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]

执行完操作 [2,2] 后, M = 
[[1, 1, 0],
 [1, 1, 0],
 [0, 0, 0]]

执行完操作 [3,3] 后, M = 
[[2, 2, 1],
 [2, 2, 1],
 [1, 1, 1]]

M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。

注意:

  1. m 和 n 的范围是 [1,40000]。
  2. a 的范围是 [1,m],b 的范围是 [1,n]。
  3. 操作数目不超过 10000。

 

// 8 ms
class Solution {
public:
    int maxCount(int m, int n, vector<vector<int>>& ops) {
        if(0 == m*n){
            return 0;
        }
        const int vecSize = ops.size();
        if(0 == vecSize){
            return m*n;
        }
        int maxX = ops[0][0] > m ? m : ops[0][0];
        int maxY = ops[0][1] > n ? n : ops[0][1];
        if(vecSize > 1){
            auto itor = ops.begin();
            ++itor;
            for(int i=1; i<vecSize; ++i,++itor){
                if(0 == (*itor)[0]*(*itor)[1]){
                    continue;
                }
                if((*itor)[0] < maxX){
                    maxX = (*itor)[0];
                }
                if((*itor)[1] < maxY){
                    maxY = (*itor)[1];
                }
            }
            if(maxX > m){
                maxX = m;
            }
            if(maxY > n){
                maxY = n;
            }
        }
        return maxX*maxY;
    }
};

 

// 24 ms

class Solution {
public:
    int maxCount(int m, int n, vector<vector<int>>& ops) {
        if(0 == m*n){
            return 0;
        }
        const int vecSize = ops.size();
        if(0 == vecSize){
            return m*n;
        }
        int maxX = ops[0][0] > m ? m : ops[0][0];
        int maxY = ops[0][1] > n ? n : ops[0][1];
        std::sort(ops.begin(), ops.end(), [](vector<int> a, vector<int> b){
            return b[0] > a[0];
        });
        for(int i=0; i<vecSize; i++)
        {
            if(ops[i][0] > 0)
            {
                maxX = ops[i][0];
                break;
            }
        }
        std::sort(ops.begin(), ops.end(), [](vector<int> a, vector<int> b){
            return b[1] > a[1];
        });
        for(int i=0; i<vecSize; i++)
        {
            if(ops[i][1] > 0)
            {
                maxY = ops[i][1];
                break;
            }
        }
        if(maxX > m){
            maxX = m;
        }
        if(maxY > n){
            maxY = n;
        }
        return maxX*maxY;
    }
};

 

other 8 ms
class Solution {
public:
    int maxCount(int m, int n, vector<vector<int>>& ops) {
        if(0 == m*n){
            return 0;
        }
        const int vecSize = ops.size();
        if(0 == vecSize){
            return m*n;
        }
        map<int, int> xMap;
        map<int, int> yMap;
        for(int i=0; i<vecSize; i++)
        {
            xMap[ops[i][0]] = ops[i][1];
            yMap[ops[i][1]] = ops[i][0];
        }
        map<int, int>::iterator itor = xMap.begin();
        while((itor->first <=0)&&(itor != xMap.end()))
        {
            itor++;
        }
        int maxX = itor->first;
        itor = yMap.begin();
        while((itor->first <=0)&&(itor != yMap.end()))
        {
            itor++;
        }
        int maxY = itor->first;
        if(maxX > m){
            maxX = m;
        }
        if(maxY > n){
            maxY = n;
        }
        return maxX*maxY;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值