LeetCode 48. Rotate Image 二维矩阵90度翻转问题,坐标推算,空间利用

本文介绍了一种在不使用额外空间的情况下将二维矩阵旋转90度的方法。通过定义特定的坐标转换规则,实现了矩阵元素的高效轮换,并提供了一个具体的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意: 90度翻转二维矩阵,且要求额外空间开销尽可能地小。

思路:弄清楚90度翻转时,每个点翻转的规律即可

假设该点的行列坐标为  (x, y)

则翻转后他的位置为  (y,n-1-x)


而这里要求空间开销小,即不应重建一个新矩阵。

则我们应当一个个点去翻转。

我用num1存当前点的值,num2为翻转后位置处的值

令下一点值 = 当前的值

接着继续这个过程,进行4次后, 一次翻转完毕,一次翻转 翻转了4个数字。


注意每次翻转的起始位置,i=k, j=k ->   n-1-k

当i<n/2时,不需要再翻转。




class Solution {
public:
    
    void change(int i,int j, vector<vector<int>>& matrix){
        int nj,ni,n,num1,num2,m ;
        n = matrix.size();
        m = 4;
        num1 = matrix[i][j];
        while(m--){
            ni = j;
            nj = n - 1 - i; 
            num2 = matrix[ni][nj];
            matrix[ni][nj] = num1;
            i = ni;j = nj;
            num1 = num2;
        }    
    }
    
    
    void rotate(vector<vector<int>>& matrix) {
        // 0 1-> 1 3-> 3 2-> 2 0
        int n = matrix.size();
        int temp,k = 0, m;
        int num1, num2;
        int i, j, ni, nj;
        i = 0;
        while(i < n/2 ){
            for(j = i;j < n - i - 1;j++){
                change(i,j,matrix);
            }
            i++;
        }
        return ;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值