
题目描述
给你一个下标从 0 开始且大小为 m x n 的整数矩阵 mat 和一个整数 k 。请你将矩阵中的 奇数 行循环 右 移 k 次,偶数 行循环 左 移 k 次。
如果初始矩阵和最终矩阵完全相同,则返回 true ,否则返回 false 。
示例 1:
输入:mat = [[1,2,1,2],[5,5,5,5],[6,3,6,3]], k = 2
输出:true
解释:
初始矩阵如图一所示。
图二表示对奇数行右移一次且对偶数行左移一次后的矩阵状态。
图三是经过两次循环移位后的最终矩阵状态,与初始矩阵相同。
因此,返回 true 。
示例 2:
输入:mat = [[2,2],[2,2]], k = 3
输出:true
解释:由于矩阵中的所有值都相等,即使进行循环移位,矩阵仍然保持不变。因此,返回 true 。
示例 3:
输入:mat = [[1,2]], k = 1
输出:false
解释:循环移位一次后,mat = [[2,1]],与初始矩阵不相等。因此,返回 false 。
提示:
1 <= mat.length <= 25 1 <= mat[i].length <= 25 1 <= mat[i][j] <= 25 1 <= k <= 50
解法
方法一:模拟
我们遍历矩阵的每个元素,判断其在循环移位后的位置是否与原位置的元素相同。
对于奇数行,我们将元素向右移动 \(k\) 个位置,因此元素 \((i, j)\) 在循环移位后的位置为 \((i, (j + k) \bmod n)\),其中 \(n\) 是矩阵的列数。
对于偶数行,我们将元素向左移动 \(k\) 个位置,因此元素 \((i, j)\) 在循环移位后的位置为 \((i, (j - k + n) \bmod n)\)。
如果在遍历过程中发现有任何一个元素在循环移位后的位置与原位置的元素不同,则返回 \(\text{false}\)。如果遍历完成后所有元素都相同,则返回 \(\text{true}\)。
时间复杂度 \(O(m \times n)\),其中 \(m\) 和 \(n\) 分别是矩阵的行数和列数。空间复杂度 \(O(1)\)。
| class Solution:
def areSimilar(self, mat: List[List[int]], k: int) -> bool:
n = len(mat[0])
for i, row in enumerate(mat):
for j, x in enumerate(row):
if i % 2 == 1 and x != mat[i][(j + k) % n]:
return False
if i % 2 == 0 and x != mat[i][(j - k + n) % n]:
return False
return True
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Solution {
public boolean areSimilar(int[][] mat, int k) {
int m = mat.length, n = mat[0].length;
k %= n;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (i % 2 == 1 && mat[i][j] != mat[i][(j + k) % n]) {
return false;
}
if (i % 2 == 0 && mat[i][j] != mat[i][(j - k + n) % n]) {
return false;
}
}
}
return true;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public:
bool areSimilar(vector<vector<int>>& mat, int k) {
int m = mat.size(), n = mat[0].size();
k %= n;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (i % 2 == 1 && mat[i][j] != mat[i][(j + k) % n]) {
return false;
}
if (i % 2 == 0 && mat[i][j] != mat[i][(j - k + n) % n]) {
return false;
}
}
}
return true;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | func areSimilar(mat [][]int, k int) bool {
n := len(mat[0])
k %= n
for i, row := range mat {
for j, x := range row {
if i%2 == 1 && x != mat[i][(j+k)%n] {
return false
}
if i%2 == 0 && x != mat[i][(j-k+n)%n] {
return false
}
}
}
return true
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | function areSimilar(mat: number[][], k: number): boolean {
const m = mat.length;
const n = mat[0].length;
k %= n;
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
if (i % 2 === 1 && mat[i][j] !== mat[i][(j + k) % n]) {
return false;
}
if (i % 2 === 0 && mat[i][j] !== mat[i][(j - k + n) % n]) {
return false;
}
}
}
return true;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | impl Solution {
pub fn are_similar(mat: Vec<Vec<i32>>, k: i32) -> bool {
let m = mat.len();
let n = mat[0].len();
let k = (k as usize) % n;
for i in 0..m {
for j in 0..n {
if i % 2 == 1 && mat[i][j] != mat[i][(j + k) % n] {
return false;
}
if i % 2 == 0 && mat[i][j] != mat[i][(j + n - k) % n] {
return false;
}
}
}
true
}
}
|