给你一个 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
示例 3:
输入:grid = [[1,-1],[-1,-1]] 输出:3
示例 4:
输入:grid = [[-1]] 输出:1
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
-100 <= grid[i][j] <= 100
进阶:你可以设计一个时间复杂度为 O(n + m)
的解决方案吗?
从右上角开始遍历。当遇到负数时,说明这一列从当前行往下的所有数(共 m - i
个数)均为负数,cnt += (m - i)
,然后 j 往左移动一个位置。否则 i 往下移动一个位置。
最后返回 cnt 值即可。
class Solution:
def countNegatives(self, grid: List[List[int]]) -> int:
m, n, cnt = len(grid), len(grid[0]), 0
i, j = 0, n - 1
while i < m and j >= 0:
if grid[i][j] < 0:
cnt += (m - i)
j -= 1
else:
i += 1
return cnt
class Solution {
public int countNegatives(int[][] grid) {
int m = grid.length, n = grid[0].length;
int cnt = 0;
for (int i = 0, j = n - 1; j >= 0 && i < m;) {
if (grid[i][j] < 0) {
cnt += (m - i);
--j;
} else {
++i;
}
}
return cnt;
}
}
function countNegatives(grid: number[][]): number {
let m = grid.length, n = grid[0].length;
let i = 0, j = n - 1;
let ans = 0;
while (i < m && j > -1) {
let cur = grid[i][j];
if (cur < 0) {
j--;
ans += (m - i);
} else {
i++;
}
}
return ans;
};
class Solution {
public:
int countNegatives(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
int i = 0, j = n - 1, cnt = 0;
while (i < m && j >= 0) {
if (grid[i][j] < 0) {
cnt += (m - i);
--j;
} else {
++i;
}
}
return cnt;
}
};
func countNegatives(grid [][]int) int {
m, n := len(grid), len(grid[0])
i, j, cnt := 0, n-1, 0
for i < m && j >= 0 {
if grid[i][j] < 0 {
cnt += (m - i)
j--
} else {
i++
}
}
return cnt
}