Java 思路巨简单,分组旋转就好,逐行注释(6ms,39.3MB)
2021年6月27日 12:09
解题思路
我们首先把每一层的元素按顺时针取出来,放到数组 data 中。
然后对 data 旋转 k % (data.length) 次,这里使用队列来简化。
然后再放回去就好了。
具体见程序吧。
代码
###java
class Solution {
public int[][] rotateGrid(int[][] grid, int k) {
// 矩阵尺寸
int m = grid.length, n = grid[0].length;
// 计算一共有多少层
int layerNumber = Math.min(m, n) / 2;
// 逐层处理
for (int i = 0; i < layerNumber; ++i) {
// 计算出来当前层需要多大的数组来存放, 计算方法是当前层最大尺寸 - 内部下一层尺寸.
int[] data = new int[(m - 2 * i) * (n - 2 * i) - (m - (i + 1) * 2) * (n - (i + 1) * 2)];
int idx = 0;
// 从左往右
for (int offset = i; offset < n - i - 1; ++offset)
data[idx++] = grid[i][offset];
// 从上往下
for (int offset = i; offset < m - i - 1; ++offset)
data[idx++] = grid[offset][n - i - 1];
// 从右往左
for (int offset = n - i - 1; offset > i; --offset)
data[idx++] = grid[m - i - 1][offset];
// 从下往上
for (int offset = m - i - 1; offset > i; --offset)
data[idx++] = grid[offset][i];
// 把旋转完的放回去
Integer[] ret = rotateVector(data, k);
idx = 0;
// 从左往右
for (int offset = i; offset < n - i - 1; ++offset)
grid[i][offset] = ret[idx++];
// 从上往下
for (int offset = i; offset < m - i - 1; ++offset)
grid[offset][n - i - 1] = ret[idx++];
// 从右往左
for (int offset = n - i - 1; offset > i; --offset)
grid[m - i - 1][offset] = ret[idx++];
// 从下往上
for (int offset = m - i - 1; offset > i; --offset)
grid[offset][i] = ret[idx++];
}
return grid;
}
private Integer[] rotateVector(int[] vector, int offset) {
// 取余, 否则会有无用功, 超时
offset = offset % vector.length;
Deque<Integer> deque = new ArrayDeque<>();
for (int item : vector) deque.add(item);
// 旋转操作
while (offset-- > 0) {
deque.addLast(deque.pollFirst());
}
return deque.toArray(new Integer[0]);
}
}