We can view the **n x n** matrix as **n/2** "loops", and rotate each loop respectively. For each loop, we swap elements for each side, and we totally need swap **3** sides to make it rotate 90 degree.

**Note**: we only need swap **x - 1** elements if the length of side of loop is **x**.

Ex: for 4 x 4 matrix which has 2 loops,

```
1 2 3 4 1 2 3 4
5 6 7 8 5 8 6 7
9 10 11 12 => 9 12 + 8 9
13 14 15 16 13 14 15 16
```

Rotate each loop

```
1 2 3 4 13 9 5 4 13 9 5 4 13 9 5 1
5 8 3 8 16 8 16 2
9 12 => 2 12 => 15 12 => 15 3
13 14 15 16 1 14 15 16 14 3 2 1 14 12 8 4
6 7 10 7 10 7 10 6
10 11 => 6 11 => 11 6 => 11 7
```

```
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0; i < n/2; i++) // for each loop
for(int j = i; j < n - i - 1; j++){
swap(matrix[i][j], matrix[n-1-j][i]);
swap(matrix[n-1-j][i], matrix[n-1-i][n-1-j]);
swap(matrix[n-1-i][n-1-j], matrix[j][n-1-i]);
}
}
};
```