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

题目:

思路:

【1】常规的二分查找处理

【2】进阶方式的处理(其实可以参考 240. 搜索二维矩阵 II 这篇的 Z 字形查找 ,因为是有序的,所以倒着找会相对更容易一些)

代码展示:

【1】常规的二分查找处理

//正常的二分方式查找第一个负数的下标
//时间0 ms 击败 100%
//内存42.8 MB 击败 61.4%
//时间复杂度:二分查找一行的时间复杂度为logm,需要遍历n行,所以总时间复杂度是O(nlogm)。
//空间复杂度:O(1)。
class Solution {
    public int countNegatives(int[][] grid) {
        int count = 0, n = grid[0].length;
        for (int i = 0; i < grid.length; i++){
            int flag = findNegative(grid[i]);
            count += n-flag;
        }
        return count;
    }
    //二分查找第一个负数的下标
    public int findNegative(int[] arr) {
        int l = 0, r = arr.length;
        while (l < r){
            int mid = (r-l)/2+l;
            if (arr[mid]>= 0){
                l = mid+1;
            }else {
                r = mid;
            }
        }
        return l;
    }
}

 

【2】进阶方式的处理

//时间0 ms 击败 100%
//内存42.5 MB 击败 97.59%
class Solution {
    public int countNegatives(int[][] grid) {
        int rowMax = grid.length,colMax = grid[0].length;
        int count = 0, row = 0 , col = grid[0].length-1;
        // 因为每次循环必走一步,所以就算是走满的话也就是 rowMax + colMax;
        while (row < rowMax && col >=0){
            if (grid[row][col] >= 0){
                // 这种情况说明这一列都没有负数
                row++;
            }else {
                // 这种情况说明该列往下都是负数,所以直接加上个数就好
                count += rowMax - row;
                //然后这一列不用再遍历了
                col--;
            }
        }
        return count;
    }

}

 

posted @ 2023-08-15 18:54  忧愁的chafry  阅读(34)  评论(0编辑  收藏  举报