"""
 * clockwise rotate
 * first reverse up to down, then swap the symmetry 
 * 1 2 3     7 8 9     7 4 1
 * 4 5 6  => 4 5 6  => 8 5 2
 * 7 8 9     1 2 3     9 6 3
*/"""
class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
      # time O(N^2) space O(1) 
        matrix.reverse()
        for i in range(len(matrix)):
            for j in range(i):
                matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]
"""

solution2: instead of using reverse(), manual reverse

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
# time O(N^2) space O(1)
        n = len(matrix)
        # step1: transpose 
        for i in range(n):
            for j in range(i):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
        # step2: each row, reverse 
        for row in matrix:
            for j in range(n//2):
                row[j],row[~j] = row[~j],row[j]