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;
}
相关推荐
xsyaaaan1 小时前
leetcode-hot100-链表
leetcode·链表
逆境不可逃3 小时前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
leaves falling4 小时前
二分查找:迭代与递归实现全解析
数据结构·算法·leetcode
做怪小疯子4 小时前
Leetcode刷题——深度优先搜索(DFS)
算法·leetcode·深度优先
想吃火锅10056 小时前
【leetcode】105. 从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
圣保罗的大教堂6 小时前
leetcode 3567. 子矩阵的最小绝对差 中等
leetcode
老鼠只爱大米6 小时前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素
逆境不可逃7 小时前
LeetCode 热题 100 之 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
_日拱一卒7 小时前
LeetCode:移动零
算法·leetcode·职场和发展
_日拱一卒8 小时前
LeetCode:字母异位词分组
算法·leetcode·职场和发展