LeetCode No.598:范围求和II 每日一题(21.11.7)
题目
给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。
操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 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。
注意:
m 和 n 的范围是 [1,40000]。 a 的范围是 [1,m],b 的范围是 [1,n]。 操作数目不超过 10000。
题解
这题乍一看,还以为是要设置二维数组,然后按他实例里面一个个去操作,最后再去比较大小,找出最大的个数。
但仔细一想,根本不用,这题就是一个脑筋急转弯,多想一下就会了。
看实例可知,他每一次操作必从[0][0]开始,那么操作范围最小的必然覆盖最多次,也就是最大整数,那么最大值便是操作数组的个数,而范围便是[min(a),min(b)]。
- C语言,数组交集
// int maxCount(int m, int n, int** ops, int opsSize, int* opsColSize){
// int len,wid;
// if(opsSize==0)
// return m*n;
// len=ops[0][1],wid=ops[0][0];
// for(int i=1;i<opsSize;i++){
// //调用函数库
// len=fmin(len,ops[i][1]);
// wid=fmin(wid,ops[i][0]);
// }
// return len*wid;
// }
/*
ops二次指针,当二维数组用就好。
opsSize,操作数的总对数
opscolSize,这啥呀这,没看懂有啥用
*/
int maxCount(int m, int n, int** ops, int opsSize, int* opsColSize){
//别看它数组啥的,最大啥的,就是求operations里数组的交集。放一起的肯定最大。
int len,wid; //设置长和宽,存放最小长宽。
if(opsSize == 0)
return m * n;
wid = ops[0][0],len = ops[0][1];
for(int i = 1;i < opsSize;i++){
if(wid > ops[i][0])
wid = ops[i][0];
if(len > ops[i][1])
len = ops[i][1];
}
return len *wid;
}
版权声明:本文为e_t_e_r_n_i_t_y原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。