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;
}
相关推荐
学习星球13 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
血小板要健康16 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
鹿角片ljp20 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
ZC跨境爬虫1 天前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
Navigator_Z1 天前
LeetCode //C - 1220. Count Vowels Permutation
c语言·算法·leetcode
feilieren1 天前
leetcode - 389. 找不同
算法·leetcode
evans在进步1 天前
LeetCode 238 除自身以外数组的乘积:前缀积与后缀积详解
算法·leetcode·职场和发展
刃神太酷啦1 天前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
wenyq72 天前
LeetCode 2904. Shortest and Lexicographically Smallest Beautiful String
算法·leetcode
_Narcissus_2 天前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治