1 minute read

4 min read 967 words

Problem Statement

leetcode problem link

Solution [Accepted]

class Solution:
    def reverseDiagonal(self, curr, matrix):
        l, r = 0, len(curr) - 1
        while l < r:
            lr, lc = curr[l]
            rr, rc = curr[r]
            matrix[lr][lc], matrix[rr][rc] = matrix[rr][rc], matrix[lr][lc]
            l += 1
            r -= 1

    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        ROWS = len(matrix)
        COLS = len(matrix[0])
        for row in range(ROWS):
            l, r = 0, COLS - 1
            while l < r:
                matrix[row][l], matrix[row][r] = matrix[row][r], matrix[row][l]
                l += 1
                r -= 1

        for row in range(ROWS):
            curr = []
            r = row
            c = COLS - 1
            while r >= 0 and c >= 0:
                curr.append([r, c])
                r -= 1
                c -= 1
            self.reverseDiagonal(curr, matrix)

        for row in range(ROWS - 1, 0, -1):
            curr = []
            r = row
            c = 0
            while r < ROWS and c < COLS:
                curr.append([r, c])
                r += 1
                c += 1
            self.reverseDiagonal(curr, matrix)

Editorial

Approach 2: Reverse on the Diagonal and then Reverse Left to Right

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        self.transpose(matrix)
        self.reflect(matrix)

    def transpose(self, matrix):
        n = len(matrix)
        for i in range(n):
            for j in range(i + 1, n):
                matrix[j][i], matrix[i][j] = matrix[i][j], matrix[j][i]

    def reflect(self, matrix):
        n = len(matrix)
        for i in range(n):
            for j in range(n // 2):
                matrix[i][j], matrix[i][-j - 1] = (
                    matrix[i][-j - 1],
                    matrix[i][j],
                )
public class Solution {
    public void Rotate(int[][] matrix) {
        int n = matrix.Length;
        Transpose(matrix, n);
        Reflect(matrix, n);
    }

    private void Transpose(int[][] matrix, int n) {
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int temp = matrix[j][i];
                matrix[j][i] = matrix[i][j];
                matrix[i][j] = temp;
            }
        }
    }

    private void Reflect(int[][] matrix, int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][n - j - 1];
                matrix[i][n - j - 1] = temp;
            }
        }
    }
}

Leave a comment