题目来源链接:https://leetcode-cn.com/problems/count-negative-numbers-in-a-sorted-matrix/
难度:简单
类型:数组
给你一个 m * n
的矩阵 grid
,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid
中 负数 的数目。
示例 1:
输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。
示例 2:
输入:grid = [[3,2],[1,0]]
输出:0
示例 3:
输入:grid = [[1,-1],[-1,-1]]
输出:3
示例 4:
输入:grid = [[-1]]
输出:1
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
-100 <= grid[i][j] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-negative-numbers-in-a-sorted-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种算法是暴力破解,即循环遍历二维数组依次判断二维数组中的每个数是否是负数,如果是则计数器加1。
第二种算法遍历二维数组中的每一行,如果遇到的第一个数是负数,那么由于是非递增排列的,所以后面的数一定是负数,所以不必再比较后面的数。如grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]],其中第一行-1是负数,count=1;第二行-1是负数,count=1+1=2;第三行第一个负数是-1,而-1后面的数必然是负数,如例后面的-2也是负数,所以count=1+1+2=4;第四行第一个负数是-1,那么-1后面一定是负数,所以count=1+1+2+4=8。
第一种算法:
/**
* 统计有序矩阵中的负数
* @param grid 有序矩阵
* @return 返回有序矩阵中负数的个数
*/
public int countNegatives(int[][] grid) {
int count=0;// 计数器,统计负数的个数
for (int[] ints : grid) {// 双层循环遍历二维数组中的数
for (int anInt : ints) {
if(anInt<0){// 如果是负数则计数器加1
count++;
}
}
}
return count;
}
第二种算法:
/**
* 统计有序矩阵中的负数(第二种算法)
*
* @param grid 有序矩阵
* @return 返回有序矩阵中负数的个数
*/
public int countNegatives(int[][] grid) {
int count = 0;// 计数器,统计负数的个数
for (int i = 0; i < grid.length; i++) {// 循环二维数组的行数
int j = 0;// 计数器,记录二维数组中的列数
while (i < grid.length && j < grid[i].length) {
if (grid[i][j] < 0) {// 判断二维数组中的数是否是负数,如果是由于是递减排列的,所以后面的数一定是负数
count += grid[i].length - j;// 直接相加即可,不必再遍历后面的数
break;
}
j++;
}
}
return count;
}