1. 程式人生 > >將矩陣順時針旋轉90度 leetCode:Rotate Image

將矩陣順時針旋轉90度 leetCode:Rotate Image

一個影象用矩陣表示,將這個影象順時針旋轉90度,也就是將矩陣順時針旋轉90度。演算法要求不使用額外的空間複雜度,in-place演算法。

觀察了一下矩陣的轉置,發現可以通過以此交換矩陣兩行,然後再求轉置的方式獲得。思路如下:

1、設矩陣有n行,則分別將i=0.1....(n/2-1)行與n-1-i行交換。(看上去有點像上半區與下半區交換)

2、求轉置,旋轉完成。

程式碼如下:

package leetCode;

public class Solution {
	
	//交換矩陣的兩行
	public void swap2line(int[][] matrix,int i,int j){
		int col = matrix[i].length;
		int temp;
		for(int k=0;k<col;k++){
			temp = matrix[i][k];
			matrix[i][k] = matrix[j][k];
			matrix[j][k] = temp;
		}
	}
	
    public void rotate(int[][] matrix) {
        if(matrix.length==0 || matrix[0].length==0){
        	return;
        }
        
        int row = matrix.length;
        int halfRow = matrix.length/2;
        
        for(int i=0;i<halfRow;i++){	//交換行
        	swap2line(matrix,i,row-1-i);
        }
        
        //求轉置
        for(int i=0,j=0;i<row;i++,j++){
        	for(int k=i+1;k<row;k++){
        		int temp = matrix[i][k];
        		matrix[i][k] = matrix[k][j];
        		matrix[k][j] = temp;
        	}
        }
    }
    
    public void display(int[][] matrix){
    	
    	for(int i=0;i<4;i++){
    		for(int j=0;j<4;j++){
    			System.out.print(matrix[i][j]+" ");
    		}
    		System.out.println();
    	}
    	System.out.println();
    }
    
    
    public static void main(String[] args) {
    	Solution s = new Solution();
    	
    	int[][] matrix = {
    			{1,2,3,4},
    			{5,6,7,8},
    			{9,10,11,12},
    			{13,14,15,16}
    	};
    	
    	s.rotate(matrix);
        s.display(matrix);
	}
}