0%

统计有序矩阵中的负数

题目地址

难度:

题目描述:

给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。

请你统计并返回 grid负数 的数目。

示例1:

1
2
3
输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。

示例2:

1
2
输入:grid = [[3,2],[1,0]]
输出:0

示例3:

1
2
输入:grid = [[1,-1],[-1,-1]]
输出:3

示例4:

1
2
输入:grid = [[-1]]
输出:1

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 100
  • -100 <= grid[i][j] <= 100
🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️解题过程🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️
解题过程:

思路:

要是暴力点就直接遍历矩阵中所有的元素,统计负数的个数。

优雅点呢就是利用矩阵的特点,非递增排列(对每行每列前者>=后者),遍历每一行,对每一个元素如果小于0,则该行其后元素都是负数。

c++代码:(执行用时4ms,击败100.00%,内存消耗8.2M,击败29.59%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int countNegatives(vector<vector<int>>& grid) {
int result=0;
for(int i=0;i<grid.size();++i){
for(int j=0;j<grid[i].size();++j){
if(grid[i][j]<0){
result+=grid[i].size()-j;
break;
}
}
}
return result;
}
};
💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎官 方 题 解💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎
官方题解:

方法一: 模拟

思路与算法

我们只需按指令模拟机器人移动的坐标即可。起始时机器人的坐标为 $(0,0)$,在遍历完所有指令并对机器人进行移动之后,判断机器人的坐标是否为 $(0,0)$ 即可。

具体来说,我们用两个变量 xx 和 yy 来表示机器人当前所在的坐标为 $(x,y)$,起始时 $x=0$,$y=0$。接下来我们遍历指令并更新机器人的坐标:

如果指令是 $U$,则令 $y=y-1$
如果指令是 $D$,则令 $y=y+1$
如果指令是 $L$,则令 $x=x-1$
如果指令是 $R$,则令 $x=x+1$
最后判断 $(x,y)$ 是否为 $(0,0)$即可。

c++代码:(执行用时12ms,击败97.42%,内存消耗8.3M,击败5.04%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool judgeCircle(string moves) {
int x = 0, y = 0;
for (const auto& move: moves) {
if (move == 'U') {
y--;
}
else if (move == 'D') {
y++;
}
else if (move == 'L') {
x--;
}
else if (move == 'R') {
x++;
}
}
return x == 0 && y == 0;
}
};

复杂度分析

  • 时间复杂度: $O(N)$,其中 $N$ 表示 $\textit{moves}$ 指令串的长度。我们只需要遍历一遍字符串即可。

  • 空间复杂度: $O(1)$。我们只需要常数的空间来存放若干变量。

⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳总 结⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳
总结:

官方题解和我的思路一样,不过有值得学习的地方。第一点可以改用增强for循环,第二点return返回时使用逻辑表达式,不像我用了if判断😆,题目还比较简单。

------------- THE END! THANKS! -------------