Leetcode--旋转图像

旋转图像

题目来源:https://leetcode-cn.com/problems/rotate-image/

给定一个 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]
]

解一:先转置,再左右镜像
再数组中,通过两次反转可以 造成一次 旋转90°的效果,因此可以通过两次反转 操作:
1.转置一次 – 沿主对角线 对称交换
2.左右翻转一次
举个例子:
1 2 3 ****** 1 4 7 ****** 7 4 1
4 5 6 -----> 2 5 8 -----> 8 5 2
7 8 9 ****** 3 6 9 ****** 9 6 3
这样我们的代码就简单了。

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
/***************************************************************/
/***************************************************************/
		//给出一个行数 或 列数 n
        int n = matrix.size();	
       //主对角线反转---转置
      for (int i = 0; i < n; ++i)
        for (int j = i + 1; j < n; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
        //左右翻转
    for (int i = 0; i < n; ++i)
        for (int j = 0 ; j < n/2; ++j) {
            swap( matrix[i][j],matrix[i][n - j - 1]);
        }
    }
};

解法2:将问题简化为 基于4个数 的子问题

解题思路
例1:
1 2 3
4 5 6
7 8 9
子问题:
1 3 9 7 和 2 6 8 4 和 5
例2:

1		2		3		4
5		6		7		8	
9	   10	   11	   12
13	   14      15	   16

子问题:

1 4 16 13 

2 8 15 9 
 
3 12 14 5 
 
6 7 11 10

对于 以 四个数 为子问题“旋转”,根据规律可以直接得出四个坐标
(**只需知道(i,j)即可得出另外3个**)
分别: 按 顺时针(n为行数==列数)

(i,j) (j,n-i-1) (n-i-1,n-j-1) (n-j-1,i)---然后按照顺时针旋转直接操作即可

对于一个n*n二维数组: 对 i,j的界限
i<=n/2 <==> i<n/2 + n%2;
j < n / 2

代码

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 / 2 ; ++j) {
            swap(matrix[n - i - 1][n - j - 1],matrix[n - j - 1][i]);
            swap(matrix[j][n - i - 1],matrix[n - i - 1][n - j - 1]);
            swap(matrix[i][j],matrix[j][n - i - 1]);
        }
       }
    } 
};

对于 j的界限问题如果有合适的解释的话,还请各位解惑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值