正方形矩阵顺时针旋转90度

说明

对于任意正方形矩阵,写一段代码,使其顺时针旋转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

猜你喜欢

转载自blog.csdn.net/weixin_34209406/article/details/91311633