乐趣区

关于java:LeetCode048旋转图像

旋转图像

题目形容:给定一个 n × n 的二维矩阵 matrix 示意一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你须要间接批改输出的二维矩阵。请不要 应用另一个矩阵来旋转图像。

示例阐明请见 LeetCode 官网。

起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

解法一:数组遍历

首先,寻找法则,找到以后节点要替换到哪个地位,寻找到的法则是 (x, y) 地位的数字通过顺时针旋转 90 度之后要放在 (y, matrix.length - 1 - x) 这个地位,而后还有一个法则是,顺时针旋转 90 度时,其实是每 4 个节点旋转了一周,所以具体的处理过程如下:

  • 从数组的第一位开始遍历,x 和 y 别离为坐标位,初始都为 0,count 为所有的节点总数,last 为以后地位的值,用一个同样大小的数组 flag 记录每一个地位是否曾经是被替换过的值;
  • 依据法则获取应该被替换的节点(nextX, nextY),判断这个节点是否曾经被替换:

    • 如果曾经被替换过,则遍历数组,寻找下一个未被替换的节点,并且初始化 x 和 y 为以后节点的坐标,temp 为以后节点的值,而后进行下一次解决;
    • 如果没有被替换过,则将以后节点的值替换为 last,并用 last 记录替换之前的值,而后更新 x 和 y 为以后值的坐标,并更新以后地位为 true 即已替换,并将 count 减一。
  • 循环中断的条件就是 count 为 0,即曾经将所有节点都解决实现。
public class LeetCode_048 {public static void rotate(int[][] matrix) {boolean[][] flag = new boolean[matrix.length][matrix.length];
        int count = matrix.length * matrix.length;
        int x = 0, y = 0, temp, last = matrix[0][0];
        while (count > 0) {
            int nextX = y, nextY = matrix.length - 1 - x;
            if (flag[nextX][nextY]) {
                // 下一个节点已替换,寻找下一个未替换的节点
                for (int i = x; i < matrix.length; i++) {
                    boolean isFound = false;
                    for (int j = 0; j < matrix.length; j++) {if (!flag[i][j]) {
                            x = i;
                            y = j;
                            last = matrix[x][y];
                            isFound = true;
                            break;
                        }
                    }
                    if (isFound) {break;}
                }
            } else {
                // 下一个节点没有被替换,则替换之,并且将之标记为已替换
                temp = matrix[nextX][nextY];
                matrix[nextX][nextY] = last;
                last = temp;
                count--;
                x = nextX;
                y = nextY;
                flag[nextX][nextY] = true;
            }
        }
    }

    public static void main(String[] args) {int[][] matrix = new int[][]{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25}};
        rotate(matrix);
        for (int[] ints : matrix) {for (int anInt : ints) {System.out.print(anInt + " ");
            }
            System.out.println();}
    }
}

【每日寄语】愿你昨晚的坏情绪,在今日掀开被子,拉开窗帘的那一刻,杳无踪影。

退出移动版