leetCode48:旋转矩阵

目录

一、题目描述

二、解题思路

三、代码实现


一、题目描述

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

二、解题思路

唉,一上来就想着从外圈一圈一圈的往里操作,每次交换四个数字,结果细节还挺烦人的……搞得耗时久了一点。

看了一下题解,竟然忘了转置的操作……这一看,行变成列,在交换下列的顺序不就是了嘛,或者先交换行的顺序在转置也行啊。

虽然题目不难,但是别人有更好的方法就值得记录下来,想大佬们学习。

三、代码实现

#include <bits/stdc++.h>
using namespace std;

//一圈一圈的去交换数即可(耗时4ms)
void rotate(vector<vector<int>>& matrix) {
	int n = matrix.size();
	int r1 = 0, r2 = n - 1;
	int c1 = 0, c2 = n - 1;
	while (r1 < r2 && c1 < c2) {
		for (int c = 0; c < c2 - c1; c++) {
			int x = matrix[r1][c1+c];
			matrix[r1][c1+c] = matrix[r2-c][c1];
			matrix[r2 - c][c1] = matrix[r2][c2-c];
			matrix[r2][c2-c] = matrix[r1+c][c2];
			matrix[r1+c][c2] = x;
		}
		r1++;
		c1++;
		r2--;
		c2--;
	}
}
//官方做法:先上下翻转,再主对角线翻转(耗时0ms)
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]);
		}
	}
}
	
int main() {
	vector<vector<int>> matrix = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25} };
	rotate(matrix);
	for (auto x : matrix) {
		for (auto i : x) {
			cout << i << " ";
		}
		cout << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值