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; } }