LeetCode简单题之统计有序矩阵中的负数

题目

给你一个 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) 的解决方案吗?
来源:力扣(LeetCode)

解题思路

  题目给出了一个矩阵并且按行按列都是(非严格)单调递减的。要想统计矩阵中的负数可以直接遍历整个矩阵,但是这样的时间复杂度就会达到O(mn),好好利用行列的递减性质也许可以达到题目的进阶条件。
  正常遍历矩阵的某一行,如果遇到的值为负数那么它后面的值也是负数,遍历矩阵的列,如果某一行的第一个值为负数那么下面所有行的值均为负数。

class Solution:
    def countNegatives(self, grid: List[List[int]]) -> int:
        m=len(grid)
        n=len(grid[0])
        s=0
        for i in range(m):
            if grid[i][0]<0:
                s+=(m-i)*n
                break
            else:
                for j in range(n):
                    if grid[i][j]<0:
                        s+=n-j
                        break
        return s

LeetCode简单题之统计有序矩阵中的负数

上一篇:Leetcode广度优先搜索笔记2 腐烂的橘子


下一篇:禁止套娃——浅谈递归思想