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;
}
相关推荐
小欣加油2 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
8Qi85 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
小欣加油10 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
怪兽学LLM11 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
Tisfy11 小时前
LeetCode 3689.最大子数组总值 I:What The Medium
算法·leetcode·题解·贪心·模拟·脑筋急转弯
moeyui70512 小时前
LeetCode 380:Insert Delete GetRandom O(1) 题解和一些延伸
算法·leetcode·职场和发展
圣保罗的大教堂12 小时前
leetcode 3689. 最大子数组总值 I 中等
leetcode
退休倒计时13 小时前
【每日一题】LeetCode 15. 三数之和 TypeScript
数据结构·算法·leetcode·typescript
小欣加油14 小时前
leetcode3689最大子数组总值I
c++·算法·leetcode·职场和发展·贪心算法
人道领域14 小时前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode