说明
对于任意正方形矩阵,写一段代码,使其顺时针旋转90度。要求空间复杂度O(1)
思路
矩阵如下
1,2,3,4,5
6,7,8,9,0
a,b,c,d,e
f,g,h,i,j
k,l,m,n,q
把矩阵看成一个“回”字型的结构,可以分成多层,这个矩阵由外到内分成了3层,但是第三层只有一个元素,所以不需要旋转。对于第一层的元素,1要放到5的位置,5放到q的位置,q放到k的位置,k放到1的位置。其他元素依次类推。处理完第一层处理第二层,7放到9的位置,9放到i的位置,i放到g的位置,g放到7的位置。
Talk is cheap
public class Rotate {
private int size;
private int[][] array;
public Rotate(int size){
this.size = size;
this.array = new int[size][size];
int index = 1;
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
this.array[i][j] = index++;
}
}
}
public Rotate rotate(){
for(int level = 0; level < this.size / 2; level ++){
int start = 0 + level;
int end = this.size - level - 1;
while(start < end){
int rightUpColIndex = this.getTargetColIndex(level);
int rightUpRowIndex = this.getTargetRowIndex(start);
int rightDownColIndex = this.getTargetColIndex(rightUpRowIndex);
int rightDownRowIndex = this.getTargetRowIndex(rightUpColIndex);
int leftDownColIndex = this.getTargetColIndex(rightDownRowIndex);
int leftDownRowIndex = this.getTargetRowIndex(rightDownColIndex);
int temp = this.array[level][start];
this.array[level][start] = this.array[leftDownRowIndex][leftDownColIndex];
this.array[leftDownRowIndex][leftDownColIndex] = this.array[rightDownRowIndex][rightDownColIndex];
this.array[rightDownRowIndex][rightDownColIndex] = this.array[rightUpRowIndex][rightUpColIndex];
this.array[rightUpRowIndex][rightUpColIndex] = temp;
start++;
}
}
return this;
}
private void print(){
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
if(j > 0){
System.out.print(",");
}
System.out.print(this.array[i][j]);
}
System.out.println();
}
}
private int getTargetRowIndex(int origColIndex){
return origColIndex;
}
private int getTargetColIndex(int origRowIndex){
return this.size - origRowIndex - 1;
}
public static void main(String[] args){
Rotate r = new Rotate(6);
System.out.println("before");
r.print();
System.out.println("after");
r.rotate2().print();
}
}
转载于:https://www.jianshu.com/p/1effaf7f027c