Skip to content

Latest commit

 

History

History
176 lines (135 loc) · 3.65 KB

File metadata and controls

176 lines (135 loc) · 3.65 KB

English Version

题目描述

给你一个 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 值即可。

Python3

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

Java

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;
    }
}

TypeScript

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;
};

C++

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;
    }
};

Go

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
}

...