題目:給定一個nn的矩陣,順時針把矩陣旋轉90度。
比如說{{1,2,3}{4,5,6}{7,8,9}}。順時針旋轉90度爲{{7,4,1}{8,5,2}{9,6,3}}。
解法一:時間複雜度爲o(nn),空間複雜度爲o(n)。
步驟:(1)把矩陣的行當做一個整體,逆序矩陣中的行,也就是說把matrix[i]行和matrix[len - i]進行交換。(2)在交換後的矩陣中,按照對角線交換每個數,也就是說交換matrix[i][j]和matrix[j][i]。因爲需要交換每一行,所以需要o(n)的額外空間
void rotate(vector<vector<int>>& matrix)
{
if (matrix.empty())
return;
int start = 0;
int last = matrix.size() - 1;
//交換矩陣中的行
while (start < last)
{
swap(matrix[start++], matrix[last--]);
}
//交換matrix[i][j]和matrix[j][i]
for (int i = 0; i < matrix.size(); ++i)
{
for (int j = 0; j < i; ++j)
{
swap(matrix[i][j], matrix[j][i]);
}
}
}
解法二:時間複雜度爲o(n*n),空間複雜度爲o(1)。我們每次只交換一個元素,而且一次就把元素交換到旋轉以後的位置。交換一個元素需要o(1)的額外的空間。
思路:
從外到內依次旋轉
void rotate(vector<vector<int>>& matrix)
{
if (matrix.empty())
return;
for (int layer = 0; layer < matrix.size() / 2; ++layer)
{
int first = layer;
int last = matrix.size() - first - 1;
for (int i = first; i < last; ++i)
{
int tmp = matrix[first][i];
matrix[first][i] = matrix[last - i + layer][first];
matrix[last - i + layer][first] = matrix[last][last - i + layer];
matrix[last][last - i + layer] = matrix[i][last];
matrix[i][last] = tmp;
}
}
}