class Solution {
public:
long long matrixSumQueries(int n, vector<vector<int>>& queries) {
}
};
6472. 查询后矩阵的和
给你一个整数 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 <= 104
1 <= queries.length <= 5 * 104
queries[i].length == 3
0 <= typei <= 1
0 <= indexi < n
0 <= vali <= 105
原站题解
python3 解法, 执行用时: 160 ms, 内存消耗: 34.5 MB, 提交时间: 2023-06-05 09:44:09
class Solution: def matrixSumQueries(self, n: int, queries: List[List[int]]) -> int: row = set() col = set() res = 0 for t,idx,val in queries[::-1]: # 行 if t == 0 and (idx not in row): # 受列限制 res += val*(n-len(col)) row.add(idx) # 列 if t == 1 and (idx not in col): # 受行限制 res += val*(n-len(row)) col.add(idx) return res
cpp 解法, 执行用时: 544 ms, 内存消耗: 207 MB, 提交时间: 2023-06-05 09:43:35
class Solution { public: long long matrixSumQueries(int n, vector<vector<int>> &queries) { long long ans = 0; unordered_set<int> vis[2]; for (int i = queries.size() - 1; i >= 0; i--) { auto &q = queries[i]; int type = q[0], index = q[1], val = q[2]; if (!vis[type].count(index)) { // 后面(>i)没有对这一行/列的操作 // 这一行/列还剩下 n-vis[type^1].size() 个可以填入的格子 ans += (long long) (n - vis[type ^ 1].size()) * val; vis[type].insert(index); } } return ans; } };
golang 解法, 执行用时: 324 ms, 内存消耗: 11.7 MB, 提交时间: 2023-06-05 09:43:17
func matrixSumQueries(n int, queries [][]int) (ans int64) { vis := [2]map[int]bool{{}, {}} for i := len(queries) - 1; i >= 0; i-- { q := queries[i] tp, index, val := q[0], q[1], q[2] if !vis[tp][index] { // 后面(>i)没有对这一行/列的操作 // 这一行/列还剩下 n-len(vis[tp^1]) 个可以填入的格子 ans += int64(n-len(vis[tp^1])) * int64(val) vis[tp][index] = true // 标记操作过 } } return }
java 解法, 执行用时: 17 ms, 内存消耗: 60.8 MB, 提交时间: 2023-06-05 09:43:05
class Solution { public long matrixSumQueries(int n, int[][] queries) { long ans = 0; Set<Integer>[] vis = new Set[]{new HashSet<>(), new HashSet<>()}; for (int i = queries.length - 1; i >= 0; i--) { var q = queries[i]; int type = q[0], index = q[1], val = q[2]; if (!vis[type].contains(index)) { // 后面(>i)没有对这一行/列的操作 // 这一行/列还剩下 n-vis[type^1].size() 个可以填入的格子 ans += (long) (n - vis[type ^ 1].size()) * val; vis[type].add(index); } } return ans; } }
python3 解法, 执行用时: 180 ms, 内存消耗: 35.1 MB, 提交时间: 2023-06-05 09:42:36
''' 倒序操作 如果对同一行反复操作,那么只有最后一次对这行的操作会计入答案。列同理。 倒序操作queries ''' class Solution: def matrixSumQueries(self, n: int, queries: List[List[int]]) -> int: ans = 0 vis = [set(), set()] for type, index, val in reversed(queries): if index not in vis[type]: # 后面(>i)没有对这一行/列的操作 # 这一行/列还剩下 n-len(vis[type^1]) 个可以填入的格子 ans += (n - len(vis[type ^ 1])) * val vis[type].add(index) # 标记操作过 return ans