1351. 统计有序矩阵中的负数https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/
难度简单96
给你一个 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
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
-100 <= grid[i][j] <= 100
方法一:【暴力遍历】
时间复杂度:O(n*m) 遍历整个矩阵的总个数。 空间复杂度:O(1)。
方法二:【二分查找】循环遍历每一行,在每一行中使用二分查找来找到正数与负数的边界。
时间复杂度:遍历每一行:O(n) 在每一行中二分查找:O(logm) 总时间复杂度:O(nlogm)
空间复杂度:O(1)。
class Solution {
public int countNegatives(int[][] grid) {
int ans = 0;
for(int i=0;i<grid.length;i++)
{
if(grid[i][0]<0) continue;
if(grid[i][grid[0].length-1]>=0)
{
ans+=grid[0].length;
continue;
}
//二分查找
int start = 0;
int end = grid[0].length-1;
int mid;
while(start<=end)
{
mid = (end-start)/2+start;
if(grid[i][mid]>=0 && grid[i][mid+1]<0)
{
System.out.println(mid);
ans+=(mid+1);
break;
}
else if(grid[i][mid]>=0) start = mid+1;
else end = mid-1;
}
}
return grid.length*grid[0].length -ans;
}
}
进阶:你可以设计一个时间复杂度为 O(n + m)
的解决方案吗?
倒序搜索:
时间复杂度:遍历n行的时间复杂度为O(n),负数倒序只遍历一遍,总的时间复杂度为O(n+m)
空间复杂度:O(1)
class Solution {
public int countNegatives(int[][] grid) {
//倒序搜索
int ans = 0;
int j=grid[0].length-1;
for(int i=0;i<grid.length;i++)
{
while(j>=0)
{
if(grid[i][j]<0 && j==0)
{
ans+=grid[0].length;
break;
}
if(grid[i][j]<0) j--;
else
{
System.out.println(j);
ans+= grid[0].length-(j+1);
break;
}
}
}
return ans;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69086.html