LeetCode-048-旋轉圖像

旋轉圖像

題目描述:給定一個 n × n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。java

你必須在 原地 旋轉圖像,這意味着你須要直接修改輸入的二維矩陣。請不要 使用另外一個矩陣來旋轉圖像。segmentfault

示例說明請見LeetCode官網。數組

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/probl...
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。網絡

解法一:數組遍歷

首先,尋找規律,找到當前節點要替換到哪一個位置,尋找到的規律是(x, y)位置的數字通過順時針旋轉90度以後要放在(y, matrix.length - 1 - x)這個位置,而後還有一個規律是,順時針旋轉90度時,實際上是每4個節點旋轉了一週,因此具體的處理過程以下:url

  • 從數組的第一位開始遍歷,x和y分別爲座標位,初始都爲0,count爲全部的節點總數,last爲當前位置的值,用一個一樣大小的數組flag記錄每個位置是否已是被替換過的值;
  • 根據規律獲取應該被替換的節點(nextX, nextY),判斷這個節點是否已經被替換:code

    • 若是已經被替換過,則遍歷數組,尋找下一個未被替換的節點,而且初始化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();
        }
    }
}
【每日寄語】 願你昨晚的壞情緒,在今日掀開被子,拉開窗簾的那一刻,杳無蹤跡。
相關文章
相關標籤/搜索