Leetcode:48. 旋转图像

xiaoxiao2025-04-28  10

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]

示例 2:

给定 matrix = [ [ 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] ]

解题思路:

题目要求,不能复制数组,也就意味着只能交换原矩阵中的数据。

1. 获取矩阵的规模size,确定矩阵的环数N。如3*3时,只需要旋转最外层的1环,4*4,需要旋转最外层的2环。N=size/2;

2. 每一环可以分解成4个部分,上,下,左,右。swap(上,右);swap(上,下);swap(上,左);之后就能将一环旋转90°。

3. 注意每一圈的上,下,左,右的初始位置,以及每一条的长度。

C++代码 class Solution { public:     void rotate(vector<vector<int>>& matrix) {         int size = matrix.size();//矩阵的行数         int N = size / 2;//需要旋转的环数         for (int i = 1; i <= N; i++) {             sub_rotate(matrix, i);         }     }     void sub_rotate(vector<vector<int>>& matrix, int N) {        //每次旋转的元素个数         int size_M = matrix.size();         pair<int, int> pos1(0 + N - 1, 1 + N - 1), pos2(1 + N - 1, size_M - 1 - (N - 1)),          pos3(size_M - 1 - (N - 1), size_M - 2 - (N - 1)), pos4(size_M - 2 - (N - 1), 0 + (N - 1));         int size = size_M - (N - 1) - N;         for (int i = 1; i <= size; i++) {             swap(matrix[pos1.first][pos1.second], matrix[pos2.first][pos2.second]);             swap(matrix[pos1.first][pos1.second], matrix[pos3.first][pos3.second]);             swap(matrix[pos1.first][pos1.second], matrix[pos4.first][pos4.second]);             pos1.second++; pos2.first++; pos3.second--; pos4.first--;         }     } };

 

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

最新回复(0)