48. 旋轉(zhuǎn)圖像:
給定一個 n × n 的二維矩陣 matrix
表示一個圖像。請你將圖像順時針旋轉(zhuǎn) 90 度。
你必須在 原地 旋轉(zhuǎn)圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉(zhuǎn)圖像。
樣例 1:
輸入:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:
[[7,4,1],[8,5,2],[9,6,3]]
樣例 2:
文章來源:http://www.zghlxwxcb.cn/news/detail-429759.html
輸入:
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]]
提示:
- n == matrix.length == matrix[i].length
- 1 <= n <= 20
- -1000 <= matrix[i][j] <= 1000
分析:
- 面對這道算法題目,二當(dāng)家的陷入了沉思。
- 一般最容易想到的就是遍歷矩陣的每個值,放到一個新矩陣?yán)锩妗?/li>
- 使用原矩陣最大的問題就是,我們知道一個位置的值旋轉(zhuǎn)后應(yīng)該放到哪里去,但是新的位置上同樣有值,不能直接覆蓋掉。
- 有經(jīng)驗的大佬們可以想到用翻轉(zhuǎn)代替旋轉(zhuǎn),把旋轉(zhuǎn)分解為2步,翻轉(zhuǎn)的特點是兩兩交換,不會覆蓋丟失原值。
- 事實上還有一個很好的辦法,矩陣,一個正方形,中心對稱,可以均分為4份(邊長為奇數(shù)時,中心點不需要移動,可以排除,其他點仍然可以4等分),然后遍歷其中一份,將4份中對應(yīng)位置的值做順序交換。
題解:
rust:
- 兩次翻轉(zhuǎn):
impl Solution {
pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
let n = matrix.len();
// 水平翻轉(zhuǎn)
(0..n / 2).for_each(|i| {
(0..n).for_each(|j| {
let temp = matrix[i][j];
matrix[i][j] = matrix[n - i - 1][j];
matrix[n - i - 1][j] = temp;
});
});
// 主對角線翻轉(zhuǎn)
(0..n).for_each(|i| {
(0..i).for_each(|j| {
let temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
});
});
}
}
- 原地旋轉(zhuǎn):
impl Solution {
pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
let n = matrix.len();
(0..n / 2).for_each(|i| {
(0..(n + 1) / 2).for_each(|j| {
let 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;
});
});
}
}
go:
func rotate(matrix [][]int) {
n := len(matrix)
// 水平翻轉(zhuǎn)
for i := 0; i < n/2; i++ {
matrix[i], matrix[n-1-i] = matrix[n-1-i], matrix[i]
}
// 主對角線翻轉(zhuǎn)
for i := 0; i < n; i++ {
for j := 0; j < i; j++ {
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
}
}
}
c++:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 水平翻轉(zhuǎn)
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
// 主對角線翻轉(zhuǎn)
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
c:
void rotate(int** matrix, int matrixSize, int* matrixColSize){
// 水平翻轉(zhuǎn)
for (int i = 0; i < matrixSize / 2; ++i) {
for (int j = 0; j < matrixSize; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[matrixSize - i - 1][j];
matrix[matrixSize - i - 1][j] = temp;
}
}
// 主對角線翻轉(zhuǎn)
for (int i = 0; i < matrixSize; ++i) {
for (int j = 0; j < i; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
python:
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
# 水平翻轉(zhuǎn)
for i in range(n // 2):
for j in range(n):
matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j]
# 主對角線翻轉(zhuǎn)
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
java:
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// 水平翻轉(zhuǎn)
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - i - 1][j];
matrix[n - i - 1][j] = temp;
}
}
// 主對角線翻轉(zhuǎn)
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
}
非常感謝你閱讀本文~
歡迎【點贊】【收藏】【評論】~
放棄不難,但堅持一定很酷~
希望我們大家都能每天進步一點點~
本文由 二當(dāng)家的白帽子:https://le-yi.blog.csdn.net/ 博客原創(chuàng)~文章來源地址http://www.zghlxwxcb.cn/news/detail-429759.html
到了這里,關(guān)于算法leetcode|48. 旋轉(zhuǎn)圖像(rust重拳出擊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!