携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
题目
leetcode 1351. 统计有序矩阵中的负数
给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。
示例 1:
输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。
示例 2:
输入:grid = [[3,2],[1,0]]
输出:0
题解
题目给出的是有序的递减数组。观察数据范围注意到矩阵不会很大,所以我们可以遍历矩阵所有数,统计负数的个数。最简单的做法我们只需要遍历矩阵所有项挨个统计即可。
优化:对于题目的递减数列我们可以直接从数组的末尾开始遍历,也可以节省一些开销。
var countNegatives = function(grid) {
let res = 0;
for (let i = 0; i <grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] < 0) {
res++;
}
}
}
return res;
};
优化写法:
var countNegatives = function(grid) {
let res = 0;
const m = grid.length;
const n = grid[0].length;
for (let i = 0; i < m; i++) {
for (let j = n - 1; j >= 0; j--) {
if (grid[i][j] >= 0) {
break;
}
res++;
}
}
return res;
}
在统计的时候也可以直接进行数学计算:
每一次遍历到正数的时候,负数的个数n - j - 1,如果第一位就是正数那么直接累计加n。
for (let i = 0; i < m; i++) {
if (grid[i][0] < 0) {
res += n;
}
for (let j = n - 1; j >= 0; j--) {
if (grid[i][j] >= 0) {
res += n - j - 1 ;
break;
}
}
}
代码详解
主要的核心代码为二维数组的遍历,不同的遍历顺序都会影响代码的执行效率。在解决问题的时候应该尝试着多用一些方法来解决问题。