难度:⭐
题目描述:
给你一个 m * n
的矩阵 grid
,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid
中 负数 的数目。
示例1:
1 | 输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]] |
示例2:
1 | 输入:grid = [[3,2],[1,0]] |
示例3:
1 | 输入:grid = [[1,-1],[-1,-1]] |
示例4:
1 | 输入:grid = [[-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 | class Solution { |
官方题解:
方法一: 模拟
思路与算法
我们只需按指令模拟机器人移动的坐标即可。起始时机器人的坐标为 $(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 | class Solution { |
复杂度分析
时间复杂度: $O(N)$,其中 $N$ 表示 $\textit{moves}$ 指令串的长度。我们只需要遍历一遍字符串即可。
空间复杂度: $O(1)$。我们只需要常数的空间来存放若干变量。
总结:
官方题解和我的思路一样,不过有值得学习的地方。第一点可以改用增强for循环,第二点return返回时使用逻辑表达式,不像我用了if判断😆,题目还比较简单。