leetcode刷题日记之旋转图像

xiaoxiao2021-02-28  40

旋转图像

给定一个 n × n 的二维矩阵表示一个图像。将图像旋转 90 度(顺时针)。
注意:你必须在原矩阵中旋转图像,请不要使用另一个矩阵来旋转图像。
例如: 给出的输入矩阵 = [ [1,2,3], [4,5,6], [7,8,9] ], 旋转输入矩阵,使其变为 : [ [7,4,1], [8,5,2], [9,6,3] ] 给出的输入矩阵 = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 旋转输入矩阵,使其变为 : [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ]

解题思路:

对比旋转之后的矩阵与旋转之前的矩阵,不难发现行向量变成了列向量,顺序不变,并且最后一个行向量为第一个列向量,第一个行向量为最后一个列向量。所以我们可以从最后一个行向量出发,一次将元素介入到每个行向量的末尾。(语言描述不清楚,直接看代码吧。。。。)
class Solution { public: void rotate(vector<vector<int>>& matrix) { if (!matrix.empty()){ //原始矩阵 // [ // [1,2,3], // [4,5,6], // [7,8,9] // ], int row = matrix.size(), col = matrix[0].size(); for (int i = row - 1; i >= 0 ; i --){//从最后一个行向量开始循环 for (int j = 0; j < col; j ++){//遍历该向量 matrix[j].push_back(matrix[i][j]);//将每个元素接到每个行向量末尾 } } //经过变换之后得到一下形式 // [ // [1,2,3,7,4,1], // [4,5,6,8,5,2], // [7,8,9,9,6,3] // ], //最后将前面原始矩阵删除 for (int i = 0; i < row; i ++){ matrix[i].erase(matrix[i].begin(), matrix[i].begin() + col); } } } };
运行耗时:4ms
不知道我这个从矩阵后面开辟空间算不算满足题目在原矩阵上变换的要求,emmm, 扎心了。。。

—————————————————————————————————————————————————

update

旋转后的矩阵还可以看作是原始矩阵转置之后再翻转得到。

转载请注明原文地址: https://www.6miu.com/read-2625639.html

最新回复(0)