查询后矩阵的和

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->查询后矩阵的和

问题描述

给你一个整数 n 和一个下标从 0 开始的 二维数组 queries ,其中 queries[i] = [typei, indexi, vali] 。

一开始,给你一个下标从 0 开始的 n x n 矩阵,所有元素均为 0 。每一个查询,你需要执行以下操作之一:

  • 如果 typei == 0 ,将第 indexi 行的元素全部修改为 vali ,覆盖任何之前的值。
  • 如果 typei == 1 ,将第 indexi 列的元素全部修改为 vali ,覆盖任何之前的值。

请你执行完所有查询以后,返回矩阵中所有整数的和。

示例 1:

输入: n = 3, queries = [[0,0,1],[1,2,2],[0,2,3],[1,0,4]]
输出: 23
解释: 上图展示了每个查询以后矩阵的值。所有操作执行完以后,矩阵元素之和为 23

示例 2:

输入: n = 3, queries = [[0,0,4],[0,1,2],[1,0,1],[0,2,3],[1,2,1]]
输出: 17
解释: 上图展示了每一个查询操作之后的矩阵。所有操作执行完以后,矩阵元素之和为 17

提示:

  • 1 <= n <= 10^4
  • 1 <= queries.length <= 5 * 10^4
  • queries[i].length == 3
  • 0 <= typei <= 1
  • 0 <= indexi < n
  • 0 <= vali <= 10^5

思路分析

首先我们应该要先理解一下题目意思,题目会给我们一个整数 n 和一个下标从 0 开始的 二维数组 queries ,n表示我们有一个下标从 0 开始的 n x n 矩阵,所有元素均为 0queries表示有若干个查询,其中 queries[i] = [typei, indexi, vali],每一个查询,我们需要执行以下操作之一:

  • 如果 typei == 0 ,将第 indexi 行的元素全部修改为 vali ,覆盖任何之前的值。
  • 如果 typei == 1 ,将第 indexi 列的元素全部修改为 vali ,覆盖任何之前的值。

我们要计算执行完所有查询以后,矩阵中所有整数的和。

这里有一个关键的点,就是每一个修改都会覆盖任何之前的值,也就是说有重复修改的话,生效的只会是最后修改的那一次。所以我们可以换个思路来想,如果我们将queries的顺序倒过来查询的话,那么生效的只会是第一次操作的那一次,这样的话我们可以再修改的时候判断一下当前行或列还有多少是没有被操作过的,填上没操作过的坑位即可。

  • 1、使用两个set分别记录被操作过的行和列

因为我们是逆序来操作,所以生效的只会是第一次操作,我们需要记录被操作过的行和列.

const colSet = new Set(),rowSet = new Set();
  • 2、修改行元素

如果 typei == 0 ,将第 indexi 行的元素全部修改为 vali ,覆盖任何之前的值,能增加的数值为当前行中未被修改过的元素 * vali.

if(type == 0){
    if(!colSet.has(index)){
        res += (n - rowSet.size) * val;
        colSet.add(index);
    }
}
  • 3、修改列元素

如果 typei == 1 ,将第 indexi 列的元素全部修改为 vali ,覆盖任何之前的值,能增加的数值为当前列中未被修改过的元素 * vali

if(type == 1){
    if(!rowSet.has(index)){
        res += (n - colSet.size) * val;
        rowSet.add(index);
    }
}

AC 代码

完整 AC 代码如下:

/**
 * @param {number} n
 * @param {number[][]} queries
 * @return {number}
 */
var matrixSumQueries = function(n, queries) {
    let res = 0;
    const colSet = new Set(),rowSet = new Set();
    for(let i = queries.length - 1; i >= 0; i--){
        const [type,index,val] = queries[i];
        if(type == 0){
            if(!colSet.has(index)){
                res += (n - rowSet.size) * val;
                colSet.add(index);
            }
        }else{
            if(!rowSet.has(index)){
                res += (n - colSet.size) * val;
                rowSet.add(index);
            }
        }
    }
    return res;
};

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。

全部评论

相关推荐

2025-12-31 14:19
门头沟学院 产品经理
点赞 评论 收藏
分享
2025-11-13 19:44
哈尔滨工程大学 Java
二战小红书,又是二面挂,还是做不到。先吃饭吧。9.18小红书商业技术实习深挖分布式锁设置五分钟过期并在finally里释放锁会不会有释放不了的时候,看门狗机制如何实现,它的后台线程是什么类型spisynchronized,monitorexit执行两次你知道吗AQS垃圾回收器mysql锁redis过期删除,怎么选取过期key,数据量大的话这键值字典和过期字典会不会比较大手撕最长上升子序列9.24小红书商业技术实习FAQ的理解实习意图识别或者提示词这块有什么细节的困难,怎么解决的实习定时任务和kafka发消息这块实现细节,现在定时任务要扫描的数据变成亿级了该怎么设计实习问答匹配率提升20%怎么来的数据,分子分母是啥看你实习了挺久,没提转正吗如果offer比较多你如何选择无手撕11.10小红书风控工程介绍实习,参数提取检验补齐有了新业务意图是需要再扩展吗,意图识别提升10%哪来的,哪块是最有挑战的,系统吞吐量多少,用到哪些大模型了java注解,自己用过吗jvm内存模型mysql什么情况适合建索引kafka怎么消息去重linux查看端口被哪个进程占用命令手撕全排列11.12小红书风控工程考研辅导经历,考研成绩,本科成绩,为什么考研,高考为什么没考好,本科成绩平平研究生成绩不错是怎么转变的,为什么走工程不走算法实习经历,提取参数的过程中用户问别的会怎么样,挑战困难,转正情况kafka会丢失消息吗,消费者消费失败broker怎么感知到从而重新投递呢,消费者怎么知道自己从哪里重新拉取,消费成功后没及时记录offset会不会重复消费rpc过程怎么找到对应服务的,一直访问注册中心会不会压力大优缺点,自驱力高的原因,怎么做到长期坚持的,平时怎么学习,平时沟通也这么谨慎吗,有什么爱好进程线程,文件内容读到内存是单线程还是多线程好,磁盘是机械磁盘和固态磁盘对答案有影响吗大文件中内容都是单词,需要对单词排序,什么思路,会内存溢出吗无手撕
查看28道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务