力扣链接:1351.统计有序矩阵中的负数
难度:⭐
✏️ 方法一:
解题关键词:二分查找
解题思路:在矩阵中,每个小数组应用二分查找,最后将总和加起来。
typescript
function countNegatives(grid: number[][]): number {
const length = grid.length;
let result = 0;
for (let i = 0; i < length; i++) {
const curCount = getArrNegativeNumsCount(grid[i]);
result += curCount;
}
return result;
}
// 获取每个数组中负数的个数
const getArrNegativeNumsCount = (arr: number[]): number => {
let left = 0;
let right = arr.length - 1;
let index = arr.length;
while (left <= right) {
const mid = Math.floor((right - left) / 2) + left;
if (arr[mid] >= 0) {
left = mid + 1;
} else {
index = mid;
right = right - 1;
}
}
return arr.slice(index).length;
};
✏️ 方法二:
解题关键词:指针
解题思路:因为该矩阵无论按照行还是按照列,都是以非严格递减顺序排列的,所以当我们第一个数组从后往前找到最后一个负数的位置 pos1 时,下一个数组中最后一个负数的 pos2 肯定在 [0, pos1] 中,利用这个特点,我们做循环
typescript
function countNegatives(grid: number[][]): number {
const length = grid.length;
const n = grid[0].length;
let pos = n - 1;
let result = 0;
for (let i = 0; i < length; i++) {
// 如果 pos 不在最后一个位置,说明该数组 pos 后面的都是负数,已经跳过了,这个时候要加上这个数字
if (pos !== n - 1) {
result += grid[i].slice(pos + 1).length || 0;
}
// 从后往前查找,找到最后一个负数的位置
for (let j = pos; j >= 0; j--) {
if (grid[i][j] < 0) {
result++;
pos = j;
} else {
break;
}
}
}
return result;
}