-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path048.RotateImage.cpp
More file actions
60 lines (49 loc) · 1.67 KB
/
048.RotateImage.cpp
File metadata and controls
60 lines (49 loc) · 1.67 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
*/
//Code:
//Code 1:
void rotate(vector<vector<int>>& matrix) {
if(matrix.size() < 2) return;
std::vector<int> vec;
int i = 0, iEnd = matrix.size() - 1, j = 0, jEnd = matrix[0].size() - 1;
for(int i = 0, iEnd = matrix.size() - 1, j = 0, jEnd = matrix[0].size() - 1;
i < iEnd && j < jEnd; ++i, ++j, --iEnd, --jEnd)
{
vec.clear();
//存第一行
for(int k = j; k <= jEnd; ++k)
vec.emplace_back(matrix[i][k]);
//left -> top
for(int m = i + 1, n = jEnd - 1;m <= iEnd && n >= j; ++m, --n)
matrix[i][n] = matrix[m][j];
//down ->left
for(int m = i+1, n = j+1;m <= iEnd && n <= jEnd; ++m, ++n)
matrix[m][j] = matrix[iEnd][n];
//right->down
for(int m = iEnd-1, n = j + 1;m >i && n < jEnd; --m, ++n)
matrix[iEnd][n] = matrix[m][jEnd];
//top->right
for(int m = i; m <= iEnd; ++m)
matrix[m][jEnd] = vec[m-i];
}
return;
}
//Code 2:
void rotate(std::vector<std::vector<int>>& matrix)
{
if (matrix.empty() || matrix.back().empty() || matrix.size() == 1) return;
const int N = (int)matrix.size();
for (int i = 0, iEnd = N / 2; i < iEnd; ++i)
{
for (int k = 0, kEnd = N - i * 2 - 1; k < kEnd; ++k)
{
std::swap(matrix[i][i + k], matrix[i+k][N-i-1]);
std::swap(matrix[i][i + k], matrix[N-i-1][N-i-k-1]);
std::swap(matrix[i][i + k], matrix[N-i-k-1][i]);
}
}
}