解法一

因为矩阵是有序的,先对与第一行进行二分查找找到第一个负数的位置,根据位置计算本行的负数个数。后面行的第一个负数位置在第一行的基础上向前移动即可找到,然后也是根据位置计算当前行负数个数。
时间复杂度:1351. 统计有序矩阵中的负数 - 图1,M为矩阵列的数量

  1. class Solution {
  2. public int countNegatives(int[][] grid) {
  3. int pos = binarySearch(grid[0]);
  4. // 矩阵列数
  5. int m = grid[0].length;
  6. int ans = m - pos;
  7. for (int i = 1; i < grid.length; ++i) {
  8. if (grid[i][m - 1] >= 0) {
  9. continue;
  10. } else {
  11. pos = m - 1;
  12. }
  13. while ((pos > 0) && (grid[i][pos - 1] < 0)) {
  14. --pos;
  15. }
  16. ans += m - pos;
  17. }
  18. return ans;
  19. }
  20. private int binarySearch(int[] arr) {
  21. if (arr[arr.length - 1] >= 0) {
  22. return arr.length;
  23. }
  24. int l = 0;
  25. int r = arr.length - 1;
  26. int mid;
  27. while (l < r) {
  28. mid = (l + r) / 2;
  29. if (arr[mid] < 0) {
  30. r = mid;
  31. } else {
  32. l = mid + 1;
  33. }
  34. }
  35. return l;
  36. }
  37. }