从0开始刷力扣,第十六天。
1 题目分析
598. 范围求和 II |
---|
给定一个初始元素全部为 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。
2 思路解析
1.先根据m,n确定二维数组
2.获取二维数组ops的第一个元素
3.由ops使数组里既定元素加一则最后arry[0][0]最大
4.找到更新后与arry[0][0]相等的元素
3 for-each循环
foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。
相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。
在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。foreach一般结合泛型
使用
4 代码如下(超出内存限制)
class Solution {
public int maxCount(int m, int n, int[][] ops) {
//先根据m,n确定二维数组
int [][]arry=new int[m][n];
//获取二维数组ops的第一个元素
for(int[] op:ops){
for(int i=0;i<op[0];i++){
for(int j=0;j<op[1];j++){
arry[i][j] += 1;
}
}
}
//count计次
int count=0;
//arry[0][0]最大
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(arry[i][j]==arry[0][0]){
count++;
}
}
}
return count;
}
}
//内存超限//
5重构思路
脑筋急转弯:每次加一都是从arry[0][0]开始且将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1,那么只有找到最小的a,b相乘即可得到最大的值出现的次数
6成功代码
public class Solution {
public int maxCount(int m, int n, int[][] ops) {
for (int[] op: ops) {
m = Math.min(m, op[0]);
n = Math.min(n, op[1]);
}
return m * n;
}
}
每日一汤
有人问我刷题有什么诀窍?
答案只有一个–{熟能生巧|you shou jiu xing}
「生命只是如此前行,不必说给别人听,只在心里最幽微的地方,时时点着一盏灯,灯上写两行字: 今日踽踽独行, 他日化蝶飞去。」
— ——林清玄 《你心柔软,却有力量》