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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 100
  • -100 <= grid[i][j] <= 100

进阶: 你可以设计一个时间复杂度为 O(n + m) 的解决方案吗?

分析:由于整个矩阵的行和列都是严格按照非递减顺序排列的,可以按行顺序遍历整个矩阵,找到第一个值为负的位置,它和它的右边值均为负,统计所有行即可得到答案。

时间复杂度为 O(n+m) 的方案,即最多遍历一次行和一次列。由于整个矩阵的行和列都是严格非递减顺序排列,可知一个点的值如果为负,那么它的右边和下边的所有值均为负数。可以从矩阵的最右上方的点开始,先向左找到第一个值为负,且它的左边的数为非负,接着向下一行,继续向左查找,直到找到左边没有数或者最下方一行为止。

可以观察到上面的方案,点的移动路线是从右上方向左下方前进,最多移动的次数就是 n+m 次。

cpp 复制代码
int countNegatives(int** grid, int gridSize, int* gridColSize) {
    int n=gridSize,m=gridColSize[0],ans=0;
    int x=0,y=m-1;
    while(x<n&&y>=0)
    {
        ans+=m-1-y;
        while(y>=0&&grid[x][y]<0)
            ans++,y--;
        if(y==-1)ans+=(n-x-1)*m;
        else x++;
    }

    return ans;
}
相关推荐
Tisfy2 小时前
LeetCode 1351.统计有序矩阵中的负数:O(m+n)时间复杂度——抽象题解
算法·leetcode·矩阵·题解·遍历
小李小李快乐不已2 小时前
算法技巧理论基础
数据结构·c++·算法·leetcode·hot100
sin_hielo2 小时前
leetcode 1351
数据结构·算法·leetcode
雪花desu2 小时前
【Hot100-Java中等】:字母异位词分组
java·算法·leetcode·哈希表
Word码2 小时前
LeetCode283. 移动零(双指针精讲)
算法·leetcode·职场和发展
YGGP3 小时前
【Golang】LeetCode 55. 跳跃游戏
算法·leetcode
练习时长一年5 小时前
Leetcode热题100(跳跃游戏 II)
算法·leetcode·游戏
小白菜又菜10 小时前
Leetcode 3432. Count Partitions with Even Sum Difference
算法·leetcode
wuhen_n11 小时前
LeetCode -- 15. 三数之和(中等)
前端·javascript·算法·leetcode