1. 程式人生 > 其它 >leetcode 48 旋轉影象

leetcode 48 旋轉影象

連結:https://leetcode-cn.com/problems/rotate-image/

題目

給定一個 n×n 的二維矩陣matrix 表示一個影象。請你將影象順時針旋轉 90 度。
你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉影象。

示例

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[[7,4,1],[8,5,2],[9,6,3]]

輸入: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]]

示例 3:
輸入:matrix = [[1]]
輸出:[[1]]
示例 4:
輸入:matrix = [[1,2],[3,4]]
輸出:[[3,1],[4,2]]

思路

該題很明顯是一道數學題。如果可以藉助輔助陣列,非常簡單,直接放入輔助陣列對應位置即可;
不借用輔助陣列情況下:
可以在原陣列上對每個位置進行交換,順時針的交換規則為:nums[row][col]->nums[nums.size()-col-1][row]->a[nums.size()-row-1][nums.size()-col-1]->nums[col][nums.size()-row-1]
對每一個正方形的的最外層進行遍歷,其中最外層的最後一個無需變換,然後對內一層的正方形繼續遍歷
我的程式碼

class Solution {
public:
	void rotate(vector<vector<int>>& matrix) {
		for (int i = 0; i<matrix.size() - 1; i++)
		{
			for (int j = i; j<matrix.size() - i - 1; j++)
			{
				int memory = matrix[i][j];
				int p = 3;
				int pi = i, pj = j,swap1;
				while (p--)
				{
					matrix[pi][pj] = matrix[matrix.size() - pj-1][pi];
					swap1 = pi;
					pi = matrix.size() - pj-1;
					pj = swap1;
				}
				matrix[pi][pj] = memory;
			}
		}
	}
};

官方題解的原陣列翻轉
他的反轉思路與我不同,他將正方形需要反轉的部分分成四塊 再根據順時針位置座標更改規則交換

程式碼

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

還有一種思路
順時針旋轉即先將正方形上下反轉,再沿對主角線反轉

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        // 水平翻轉
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                swap(matrix[i][j], matrix[n - i - 1][j]);
            }
        }
        // 主對角線翻轉
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
};