在LeetCode的每日一题中,有一个题目是关于统计有序矩阵中的负数的。这个题目要求我们统计一个m x n的矩阵中负数的个数。矩阵是按行和列排序的,即每一行的数字从左到右递增,每一列的数字从上到下递增。针对这个问题,我们可以采用从右上角(或左下角)开始遍历的方法,这种方法可以有效地减少遍历的次数,提高算法的效率。具体思路是:如果当前位置的数字小于0,那么它下面的所有数字都小于0,可以将这一列的负数数量累加到结果中,然后向左移动;如果当前位置的数字大于等于0,则向下移动。这种方法的时间复杂度是O(m+n),比传统的二分查找方法更高效。下面是具体的代码实现:

public int countNegatives(int grid) {
    int m = grid.length;
    int n = grid[0].length;
    int top = 0;
    int ans = 0;
    while (n > 0 && top < m) {
        if (grid[top][n - 1] < 0) {
            ans += m - top;
            n--;
        } else {
            top++;
        }
    }
    return ans;
}

这个方法首先初始化top为0,ans为0,然后进入一个while循环,循环条件是n大于0且top小于m。在循环中,如果当前位置的数字小于0,就将m-top加到ans上,并将n减1;如果当前位置的数字大于等于0,就将top加1。最后返回ans的值,即负数的总数。

标签: none

评论已关闭