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
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 100-100 <= grid[i][j] <= 100
进阶:你可以设计一个时间复杂度为 O(n + m) 的解决方案吗?
解法
方法一:从左下角开始遍历
由于矩阵是按行和按列非严格递减排序的,我们可以从矩阵的左下角开始遍历,记当前位置为 \((i, j)\)。
如果当前位置的元素大于等于 \(0\),说明该行的前面所有元素也都大于等于 \(0\),因此我们将列索引 \(j\) 向右移动一位,即 \(j = j + 1\)。
如果当前位置的元素小于 \(0\),说明该列的当前元素以及其右侧的所有元素都是负数,因此我们可以将负数的数量增加 \(n - j\)(其中 \(n\) 是矩阵的列数),然后将行索引 \(i\) 向上移动一位,即 \(i = i - 1\)。
我们重复上述过程,直到行索引 \(i\) 小于 \(0\) 或列索引 \(j\) 大于等于 \(n\)。最终,负数的数量即为答案。
时间复杂度 \(O(m + n)\),其中 \(m\) 和 \(n\) 分别是矩阵的行数和列数。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |