判断二维矩阵是否满足特定条件的最优解法解析
在日常刷题过程中,我们常常遇到各种关于二维矩阵的判断问题。本篇博客将带你一步步理解并实现一个非常有意思的矩阵验证问题:判断每个格子是否满足特定条件,并给出一套简单、高效的解决方案。
一、题目描述
给定一个大小为 m x n
的二维矩阵 grid
,我们需要判断这个矩阵中的每一个格子 grid[i][j]
是否满足以下两个条件:
- 下方一致性条件:如果下面的格子存在(即
i + 1 < m
),那么它需要和当前格子相等,即:
grid[i][j] == grid[i + 1][j]
- 右边不等条件:如果右边的格子存在(即
j + 1 < n
),那么它需要和当前格子不相等,即:
grid[i][j] != grid[i][j + 1]
如果矩阵中所有格子都满足这两个条件,我们返回 True
,否则返回 False
。
二、思路分析
这个问题的本质是对每个格子进行检查,看它与右边、下方格子的关系是否符合条件。由于每个格子只需要与固定两个方向(右,下)进行比较,我们可以直接使用双重循环,遍历每一个位置即可。
✅ 判断逻辑
对于坐标 (i, j)
:
- 如果
j + 1 < n
,即右边存在,判断是否与右边相等 → 不符合条件; - 如果
i + 1 < m
,即下方存在,判断是否与下方不相等 → 不符合条件。
三、Python 实现(最优解)
from typing import List
class Solution:
def satisfiesConditions(self, grid: List[List[int]]) -> bool:
Rows = len(grid)
Cols = len(grid[0])
for r in range(Rows):
for c in range(Cols):
# 条件1:当前格子不能和右边相等
if c < Cols - 1 and grid[r][c] == grid[r][c + 1]:
return False
# 条件2:当前格子必须和下面相等
if r < Rows - 1 and grid[r][c] != grid[r + 1][c]:
return False
return True
四、优化建议(更 Pythonic)
虽然上面的代码已经很简洁高效了,但我们可以进一步优化,使其更“Pythonic”,例如省略变量名简化:
class Solution:
def satisfiesConditions(self, grid: List[List[int]]) -> bool:
for r in range(len(grid)):
for c in range(len(grid[0])):
if c + 1 < len(grid[0]) and grid[r][c] == grid[r][c + 1]:
return False
if r + 1 < len(grid) and grid[r][c] != grid[r + 1][c]:
return False
return True
五、复杂度分析
- 时间复杂度:O(m × n),其中
m
为行数,n
为列数。每个格子最多比较两个方向。 - 空间复杂度:O(1),只使用了常数额外空间。
六、示例测试
grid = [
[1, 2, 3],
[1, 3, 4],
[1, 4, 5]
]
sol = Solution()
print(sol.satisfiesConditions(grid)) # 输出 False
这个例子中:
grid[0][1] == grid[0][2]
不成立(满足右边不等条件)- 但是
grid[1][0] != grid[2][0]
不符合下方一致性条件 所以函数会返回False
。
七、总结
这个问题的核心在于:
- 理解“对格子的局部约束”;
- 巧用双层遍历配合边界判断;
- 保持代码结构简洁明了。
以上就是本篇博客的全部内容了。如果你也在刷 LeetCode 或准备面试,建议多积累这类二维矩阵题目的处理技巧,很多图形类、图搜索类题目都逃不开矩阵遍历这个基本功。
📌 欢迎留言交流你对这道题的思考,或者提出更优的解决方式!
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏或转发!🙌