首页 > 试题广场 >

旋转图像

[编程题]旋转图像
  • 热度指数:12020 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给出一个用二维矩阵表示的图像
返回该图像顺时针旋转90度的结果
扩展:
你能使用原地算法解决这个问题么?
//注意调节好参数,不然就错一个数字也要调试好久
//因为旋转矩阵的时候如果仅交换两个值会有覆盖现象
//所以从容易理解的逻辑出发,需要额外存储空间暂存值,运行时间57ms空间11372k
    public void rotate(int[][] matrix) {

        int[] arr = new int[matrix.length];  //存矩形的上边(上面行)
        int[] arr1 = new int[matrix.length];  //存矩形的右边
        if (matrix.length == 1) {
            return;
        }
//       看作多个嵌套旋转的四边框,左上角坐标(i,i)
        for (int i = 0; i <= (matrix.length - 1) / 2; i++) {
             if((i==(matrix.length - 1) / 2)&&(matrix.length%2>0)){
                 break;
             }
//            储存上面行
            int count = 0;
            int nailIndex = matrix.length - 1 - i;
            for (int up = i; up <= nailIndex; up++) {
                arr[count] = matrix[i][up];
                count++;
            }
//            储存右边行
            int count1 = 0;
            for (int rightIn = i; rightIn <= nailIndex; rightIn++) {
                arr1[count1] = matrix[rightIn][nailIndex];
                count1++;
            }
//            左行盖上面行
            int leftTemp=i;
            for (int left = nailIndex; left >= i; left--) {
                matrix[i][left] = matrix[leftTemp][i];
                leftTemp++;
            }
//            下面换到左边
            for (int down = i; down <= nailIndex; down++) {
                matrix[down][i] = matrix[nailIndex][down];
            }
//            储存的上边行覆盖右边行
            count = 0;
            for (int rightSav = i ; rightSav <= nailIndex; rightSav++) {
                matrix[rightSav][nailIndex] = arr[count];
                count++;
            }
//            存储的右边换到下面
            count1 = 0;
            for (int right = nailIndex; right >=i; right--) {
                matrix[nailIndex][right]=arr1[count1];
                count1++;
            }
        }
    }

编辑于 2020-09-24 17:48:49 回复(0)
public class Solution {
    public void rotate(int[][] matrix) {
        int len = matrix.length;
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < i; j++) {
				int tmp = matrix[j][i];
				matrix[j][i] = matrix[i][j];
				matrix[i][j] = tmp;
			}
		}
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len / 2; j++) {
				int tmp = matrix[i][j];
				matrix[i][j] = matrix[i][len - j - 1];
				matrix[i][len - j - 1] = tmp;
			}
		}
    }
}

发表于 2020-08-01 17:36:52 回复(0)
import java.util.*;
public class Solution {
    public void rotate(int[][] matrix) {
		int len = matrix.length;
		int[][] copy = new int[len][matrix[0].length];
		for(int i = 0; i < len; i++)
			copy[i] = Arrays.copyOf(matrix[i], matrix[i].length);
        for(int i = 0; i < len; i++){
            for(int j = 0; j < len; j++){
                matrix[j][len-i-1] = copy[i][j];
            }
        }
        return;
    }
}


发表于 2019-09-30 13:09:59 回复(0)
最外圈到最里圈,一层一层的转
关键点:a[ i ][ j ] 这个点下一个位置是: a[ n-1-j ][ i ]
public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i=0;i<n/2;i++){
            for(int j=i;j<n-i-1;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n-1-j][i];
                matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
                matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
                matrix[j][n-1-i] = temp;
            }
        }
    }
}

发表于 2018-08-31 16:20:46 回复(2)
public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int temp = 0;
        for (int i = 0; i < n / 2; i++) {
            for (int j = i; j < n - 1 - i; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n-j-1][i];
                matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
                matrix[n-i-1][n-j-1] = matrix[j][n-i-1];
                matrix[j][n-i-1] = temp;
            }
        }
    }
}
发表于 2018-03-30 09:45:00 回复(0)
public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i=0; i<n/2; i++) 
            for(int j=i; j<n-1-i; j++) {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n-1-j][i];
                matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
                matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
                matrix[j][n-1-i] = tmp;
            }
    }
}

发表于 2017-06-15 14:12:10 回复(0)
public class Solution {
    public void rotate(int[][] matrix) {
		int n = matrix.length;
		for (int i = 0; i < n; i ++) {
			for (int j = 0; j < n - i; j ++) {
				matrix[i][j] = matrix[n - 1 - j][n - 1 - i] ^ matrix[i][j] ^ (matrix[n - 1 - j][n - 1 - i] = matrix[i][j]);
			}
		}
		for (int i = 0; i < n / 2; i ++) {
			for (int j = 0; j < n; j ++) {
				matrix[i][j] = matrix[n - 1 - i][j] ^ matrix[i][j] ^ (matrix[n - 1 - i][j] = matrix[i][j]);
			}
		}
	}
}

发表于 2017-03-20 14:02:14 回复(0)

The idea was firstly transpose the matrix and then flip it symmetrically. For instance,

1  2 3 4  5 6 7  8 9 

after transpose, it will be swap(matrix[i][j], matrix[j][i])

1  4 7 2  5 8 3  6 9 

Then flip the matrix horizontally. (swap(matrix[i][j], matrix[i][matrix.length-1-j])

7  4 1 8  5 2 9  6 3 

Hope this helps.

public class Solution {
    public void rotate(int[][] matrix) { for(int i = 0; i<matrix.length; i++){ for(int j = i; j<matrix[0].length; j++){ int temp = 0;
                temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp;
            }
        } for(int i =0 ; i<matrix.length; i++){ for(int j = 0; j<matrix.length/2; j++){ int temp = 0;
                temp = matrix[i][j]; matrix[i][j] = matrix[i][matrix.length-1-j]; matrix[i][matrix.length-1-j] = temp;
            }
        }
    }
}
发表于 2017-03-12 14:37:51 回复(1)