算法--统计负数

114 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

题目

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

题解

题目给出的是有序的递减数组。观察数据范围注意到矩阵不会很大,所以我们可以遍历矩阵所有数,统计负数的个数。最简单的做法我们只需要遍历矩阵所有项挨个统计即可。

优化:对于题目的递减数列我们可以直接从数组的末尾开始遍历,也可以节省一些开销。

var countNegatives = function(grid) {
     let res = 0;

     for (let i = 0; i <grid.length; i++) {
         for (let j = 0; j < grid[i].length; j++) {
             if (grid[i][j] < 0) {
                 res++;
             }
         }            
     }
     return res;
};

优化写法:

var countNegatives = function(grid) {
    let res = 0;
    const m = grid.length;
    const n = grid[0].length;
    for (let i = 0; i < m; i++) {
        for (let j = n - 1; j >= 0; j--) {
            if (grid[i][j] >= 0) {
                break;
            }
            res++;
        }            
    }
    return res;
}

在统计的时候也可以直接进行数学计算: 每一次遍历到正数的时候,负数的个数n - j - 1,如果第一位就是正数那么直接累计加n。

for (let i = 0; i < m; i++) {
        if (grid[i][0] < 0) {
            res += n;
        }
        for (let j = n - 1; j >= 0; j--) {
            if (grid[i][j] >= 0) {
                res += n - j - 1 ;
                break;
            }
        }            
    }

代码详解

主要的核心代码为二维数组的遍历,不同的遍历顺序都会影响代码的执行效率。在解决问题的时候应该尝试着多用一些方法来解决问题。