第一题:
给你一个 m * n
的矩阵 grid
,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid
中 负数 的数目。
class Solution {
public int countNegatives(int[][] grid) {
int res = 0;
for (int[] arr : grid) {
res += size(arr);
}
return res;
}
int size(int[] arr) {
// 最左边的 负数
int res = arr.length;
int l = 0, r = arr.length - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (arr[m] < 0) {
res = m;
r = m - 1;
} else {
l = m + 1;
}
}
return arr.length - res;
}
}
第二题:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int l = 0;
int r = m * n - 1;
while (l <= r) {
int mid = (r - l) / 2 + l;
int x = matrix[mid / n][mid % n];
if (x > target) {
r = mid - 1;
} else if (x == target) {
return true;
} else {
l = mid + 1;
}
}
return false;
}
}