【发布时间】:2018-02-04 01:50:08
【问题描述】:
我想旋转二维数组中的内部正方形,如下面的“示例”图像:
给定左上角和右下角的位置。
我尝试将它拆分为另一个二维数组,然后旋转它。但它会消耗大量的 O 循环运行时间和内存。
static int[][] rotateMatrix(int[][] subSquare) {
int n = subSquare.length;
int[][] temp = new int [n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
temp[i][j] = subSquare[n - j - 1][i];
}
}
return temp;
}
static int[][] getInnerSquare(int[][] square, int ai, int bi, int di){
int g = 0, h = 0;
int[][] innerSquare = new int[di+1][di+1];
for(int k = ai - 1; k < ai + di; k++) {
for(int j = bi - 1; j < bi + di; j++) {
innerSquare[g][h] = square[k][j];
h++;
}
g++;
h=0;
}
return innerSquare;
}
static void replaceInnerSquare(int[][] square, int[][] innerSquare, int ai, int bi, int di) {
int g = 0, h = 0;
for(int i = ai - 1; i < ai + di; i++) {
for(int j = bi - 1; j < bi + di; j++) {
square[i][j] = innerSquare[g][h];
h++;
}
g++;
h=0;
}
}
public static void main(String[] args){
//follow the image: ai = 1, bi = 2, di = 3
// top-left corner (ai, bi), bottom-right corner(ai + di, bi + di)
subSquare = getInnerSquare(square, ai, bi, di);
subSquare = rotateMatrix(subSquare);
replaceInnerSquare(square, subSquare, ai, bi, di);
}
这个问题有没有更好的解决方案? 谢谢!!!!
【问题讨论】:
-
好的,请显示您拥有的当前代码以及您为实现所需输出所做的尝试。 “但是它需要大量的 O 循环运行时间和内存”完全没有意义,在您声称的 O(n) 情况下,n 是多少?
-
更新了我的代码
-
您当然不必将正方形复制到另一个矩阵中。观察比四次旋转后任何元素返回到其原始位置。所以只有四个元素受到影响。编写一个重新排列这四个元素的方法并在循环中调用它。
-
要考虑的更好/更差解决方案的定量衡量标准是什么 - 您将如何决定最佳答案? 总 SLOC 计数? 矩阵以纳秒为单位的旋转部分持续时间?最后将比较矩阵的参考大小吗?感谢澄清指标。
标签: java algorithm performance matrix multidimensional-array