【Golang】LeetCode 1351. 统计有序矩阵中的负数

1351. 统计有序矩阵中的负数

题目描述

思路

这是2025 / 12 / 28的每日一题,使用双重循环暴力穷举的方式当然可以直接解题,但是题目要求我们思考一种`O(n+m)O(n + m)O(n+m)的解决方案,因此我们使用时间复杂度为O(n+m)O(n + m)O(n+m)的方案解题。

需要注意一条题目中提到的性质,那就是数组grid无论是从行还是从列的角度来观察,都是严格单调不增 的。这给了我们一条思路,那就是我们是否可以从"副对角线"出发,在每一行找到"负数"的起点,并将负数起点到行末这一段数的个数累加到答案当中?答案是可以的 。原因在于,由于数组无论从行还是从列都是单调不减的,如果grid[i][j] < 0,并且j是这一行第一个负数,那么一定有grid[i + 1][j] < 0grid[i + 1][j] < grid[i][j],因此i + 1这一行负数的起点至少是j,也可能是j - 1或更前面的下标。

基于上述性质,我们从副对角线出发设置一个变量pos,用于记录每一行第一个负数出现的位置,至上而下pos最多移动m次,还需要对行进行遍历,也就是n次,最终的时间复杂度就是O(n+m)O(n + m)O(n+m)。

Golang 题解

go 复制代码
func countNegatives(grid [][]int) int {
    n := len(grid[0])
    pos := n - 1
    ans := 0
    for _, row := range grid {
        i := pos
        for ; i >= 0; i -- {
            if row[i] >= 0 {
                if i + 1 < n {
                    pos = i + 1
                    ans += n - pos
                }
                break
            }
        }
        if i == -1 {
            pos = -1
            ans += n
        }
    }
    return ans
}
相关推荐
IT小白杨4 小时前
社媒多账号运营的环境隔离:一张图谱模型,解释清“为什么换IP还是被连坐“
经验分享·笔记·矩阵·指纹浏览器
Tisfy7 小时前
LeetCode 0836.矩形重叠:xy两方向分别看
数学·leetcode·题解·模拟
青山木8 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划
土司大王8 小时前
LeetCode hot100——33.搜索旋转排序数组:Java 二分模板与 O(log n) 实现
数据结构·算法·leetcode
辰辉创聚9 小时前
禽流感病毒分子基础:表面抗原与内部转录复合体的功能解析
ide·leetcode·rabbitmq·重组血凝素蛋白·甲型流感病毒核蛋白·禽流感单抗
ysu_031411 小时前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode
土司大王11 小时前
LeetCode hot100——153.寻找旋转排序数组中的最小值:Java 二分模板与 O(log n) 分析
java·算法·leetcode
土司大王11 小时前
LeetCode hot100——4.寻找两个正序数组的中位数:Java 二分第K小 递归裁剪
java·算法·leetcode
6Hzlia13 小时前
【Classic 150 刷题计划】 LeetCode 123. 买卖股票的最佳时机 III | C++ 状态机动态规划与通用交易拓展
c++·算法·leetcode