解法一
因为矩阵是有序的,先对与第一行进行二分查找找到第一个负数的位置,根据位置计算本行的负数个数。后面行的第一个负数位置在第一行的基础上向前移动即可找到,然后也是根据位置计算当前行负数个数。
时间复杂度:,M为矩阵列的数量
class Solution {public int countNegatives(int[][] grid) {int pos = binarySearch(grid[0]);// 矩阵列数int m = grid[0].length;int ans = m - pos;for (int i = 1; i < grid.length; ++i) {if (grid[i][m - 1] >= 0) {continue;} else {pos = m - 1;}while ((pos > 0) && (grid[i][pos - 1] < 0)) {--pos;}ans += m - pos;}return ans;}private int binarySearch(int[] arr) {if (arr[arr.length - 1] >= 0) {return arr.length;}int l = 0;int r = arr.length - 1;int mid;while (l < r) {mid = (l + r) / 2;if (arr[mid] < 0) {r = mid;} else {l = mid + 1;}}return l;}}
