问题描述:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:

Could you do this in-place?

中文题目:

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。

分析:

过程如下图所示:

step1:



step1的结果为:

step2:



step2的结果为:

step3:



step4:

上图的圆圈中的元素按照上述顺序互换

这样,一层结束了;

step5:

在二维数组的内层继续执行step1–step4,直到最内层结束;

代码如下:

class Rotate {
public:
void swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
if(n == 1 || n == 0)
return mat; int up = 0;
int right = n-1;
int down = n-1;
int left = 0; while(up < down && left < right)
{
//1,2 swap
int begin1 = up + 1;
for(int i = left + 1;i < right;i++)
{
swap(mat[up][i],mat[begin1++][right]);
}
//1 4 swap
begin1 = down - 1;
for(int i = left + 1;i < right;i++)
{
swap(mat[up][i],mat[begin1--][left]);
}
//3 4 swap
begin1 = up + 1;
for(int i = left + 1;i < right;i++)
{
swap(mat[down][i],mat[begin1++][left]);
}
//圆圈内的四个角上的元素互换
swap(mat[up][left],mat[up][right]); swap(mat[up][left],mat[down][left]); swap(mat[down][left],mat[down][right]); up++;
down--;
left++;
right--;
}
return mat;
}
};

算法实现在数组本地实现,空间复杂度为O(1).

Rotate Image(二位数组顺时针旋转)的更多相关文章

  1. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

  2. C++ 出现bug :二位数组的操作运算,求非对角线的元素的和

    编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; ...

  3. PHP 之二位数组根据某个字段排序封装

    /** * @param $array * @param $keys * @param string $sort * @return array */ function arraySort($arra ...

  4. java中Arrays.sort()对二位数组进行排序

    int [][]a = new int [5][2]; //定义一个二维数组,其中所包含的一维数组具有两个元素 对于一个已定义的二位数组a经行如下规则排序,首先按照每一个对应的一维数组第一个元素进行升 ...

  5. LeetCode——Rotate Image(二维数组顺时针旋转90度)

      问题: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...

  6. php二位数组合并

    转自:http://www.cnblogs.com/losesea/archive/2013/06/14/3134900.html 题目:有以下2个二维数组 1$a=Array(0 => Arr ...

  7. 【shell】构造并遍历二位数组的一种用法

    参考shell数组的部分操作用法,实现了构造和遍历二维数组的一种方式,具体如下: #数组元素以空格分割 sites=("www.a.com www.b.com www.c.com www.d ...

  8. shell二位数组——终端字符下降动画

    猜想:Shell支持关联数组,可以利用关联数组模拟二维数组. [验证猜想] #!/bin/bash array[1,1]=1 array[2,1]=2 array[3,1]=3 for i in `s ...

  9. vector创建二位数组

    默认初始化vector vector<vevtor<int> > arr(row, vector<int>(col, 0)); //指定行大小为row,列为col, ...

随机推荐

  1. 【RF库Collections测试】Set List Value

    Name:Set List ValueSource:Collections <test library>Arguments:[ list_ | index | value ]Sets th ...

  2. 【整理】LINUX下使用CMAKE安装MYSQL

    原文地址:http://www.cppblog.com/issay789/archive/2013/01/05/196967.html 一.安装 m4 下载地址: http://files.w3pc. ...

  3. 实现iOS中的链式编程

    谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...

  4. listView优化方案

    1.如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用.在这个方法中尽 ...

  5. Android Studio 无法预览xml布局视图的解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lvyoujt/article/details/73283762 提示:failed to load ...

  6. JS使用中碰到的一些问题

    settimeout: 1.setTimeout(function () {//这个则会在1秒后进行弹出1 alert(1); }, 1000); 2.setTimeout(alert(1), 100 ...

  7. tp3.2 ajax 表单提交

    前台: 1 <form action="javascript:;" method="post" class="form_div" id ...

  8. 【linux】nginx options 跨域问题 请求HTTP错误405 用于访问该页的HTTP动作未被许可 Method Not Allowed

    JavaScript JS 跨域问题 HTTP 错误 405 - 用于访问该页的 HTTP 动作未被许可HTTP 错误 405.0 - Method Not Allowed Nginx 处理跨域问题. ...

  9. 【linux系列】cenos7安装jdk

    一.下载jdk,我采用的jdk.tar.gz的安装包 二.创建jdk安装目录 三.安装包解压 四.jdk环境变量配置 五.使配置的环境变量生效 六.检查jdk是否安装成功

  10. ASP.NET使用百度编辑器(UEditor)使用方法

    ASP.NET使用百度编辑器(UEditor)方法如下 第一步到百度官网下载百度编辑器 http://ueditor.baidu.com/website/download.html 下载.net版本 ...