在刷题的过程中,积累了矩阵的一些常见的操作,这里特点做一下笔记,以供后续进阶学习。

1. 基本操作


1.1 沿主对角线翻转方阵


代码实现:

public void rotate(int[][] matrix) {// 1. 临界条件if(matrix == null || matrix.length == 0) return;// 注意:方阵的行==列int rows = matrix.length;// 2. 核心逻辑for(int i = 0; i < rows; i++) {for(int j = i ; j < rows; j++){int tmp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = tmp;}}
}

1.2 原地沿副对角线翻转方阵


代码实现:

public void rotate(int[][] matrix) {// 1. 临界条件if(matrix == null || matrix.length == 0) return;// 注意:方阵的行==列int rows = matrix.length;// 2. 核心逻辑for(int i = 0; i < rows; i++) {// 和主对角线的差别在于这里。for(int j = 0 ; j < rows - i; j++){int tmp = matrix[i][j];matrix[i][j] = matrix[rows-1 - j][rows-1 - i];matrix[rows - 1 - j][rows - 1 - i] = tmp;}}
}

1.3 沿竖直线翻转方阵

public void rotate(int[][] matrix) {// 1. 临界条件if(matrix == null || matrix.length == 0) return;// 注意:方阵的行==列int rows = matrix.length;// 2. 核心逻辑:对每一层都进行翻转。for(int i = 0; i < rows; i++) {int left =0;int right = rows - 1;while(left < right) {int tmp = matrix[left][right];matrix[left][right] = matrix[right][left];matrix[right][left] = tmp;}}
}

2 . 进阶

经常刷题的同学可能都会注意到,所谓的中等难度(Medium)困难难度(Hard) 很多都是将N个(N>1)基本技巧集中到一道题中。(PS: 这里不去吐槽 Leetcode的难度系数说明多么的“科学”)


上面的图对应的就是 48. 旋转图像 - M

2.1 思路1


大家可以观察上面的三张图,解题的思路都在这里面啦。
实现1:

正对角线翻转,再竖直线翻转;

 public void rotate(int[][] matrix) {int rows = matrix.length;int n = matrix.length;//1. 先沿正对角线翻转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;}// 2. 沿竖直线翻转for(int i = 0; i < rows; i++){int left = 0;int right = rows-1;while(left < right){int tmp = matrix[i][left];matrix[i][left] = matrix[i][right];matrix[i][right] = tmp;left ++;right --;}}}

实现2:

竖直线翻转,再副对角线翻转;

     public void rotate(int[][] matrix) {if(matrix == null || matrix.length == 0){return ;}int rows = matrix.length;// 1. 竖直线翻转for( int i = 0; i < rows; i++){int left = 0;int right = rows- 1;while(left < right){int tmp = matrix[i][left];matrix[i][left] = matrix[i][right];matrix[i][right] = tmp;            left++;right--;}}// 2. 副对角线翻转for(int i = 0 ; i < rows; i++){for(int j = 0; j < rows - i; j++){int tmp = matrix[i][j];matrix[i][j] = matrix[rows-1-j][rows-1-i];matrix[rows-1-j][rows-1-i] = tmp;}}}     

2.2 思路2

思路:
每个i表示一个圈,不论len是奇是偶都是一共有len/2个圈要进行旋转,从外圈向内依次旋转,直到中心点或者最内圈

public void rotate(int[][] matrix) {int len = matrix.length;// i 代表圈次,一共要进行 len /2 的旋转。for (int i = 0; i < len / 2; i++) {int start = i;int end = len - i - 1;for (int j = 0; j < end - start; j++) {int temp = matrix[start][start + j];matrix[start][start + j] = matrix[end - j][start];matrix[end - j][start] = matrix[end][end - j];matrix[end][end - j] = matrix[start + j][end];matrix[start + j][end] = temp;}}      }

旋转方阵So easy相关推荐

  1. 【计算机算法】递归——打印旋转方阵(正转及逆转)

    通过如下程序来打印旋转方阵 思想: 填充数组后通过控制输出的格式,就可以打印顺转.逆转的旋转方阵 #include<stdio.h> int a[100][100]; int m = 1; ...

  2. 算法设计与分析:分治法输出数字旋转方阵

    分治法输出数字旋转方阵 数字旋转方阵如下图所示: 从下图可以看出,从左上角开始,逆时针放置每次增加1的数字,直到"旋转"到最里层终止. 分治:将这个矩阵填数之时一层一层地填进去,也 ...

  3. 数字旋转方阵c语言主函数,数据结构——递归求数字旋转方阵

    [数字旋转方阵问题] 问题描述:输出下图所示N×N(N≥1)的数字旋转方阵.要求:采用递归法实现. 提示:注意观察A.B.C.D四个区域. void FillInNum(int number, int ...

  4. 递归-数字旋转方阵问题

    问题描述: 输出下图所示N×N(N≥1)的数字旋转方阵.要求:采用递归法实现. 提示:注意观察A.B.C.D四个区域. 核心思想: 先用数组a[i][j]存储数字num(从1至N2),然后打印. 递归 ...

  5. 数字旋转方阵问题-分治法

    分治法: 数字旋转方阵问题 #include<stdio.h> #include <iostream> #include<iomanip> using namesp ...

  6. 数字旋转方阵 c++数据结构

    实现输出10*10以内的数字旋转方阵,如果需要修改输出的方阵的大小可以改变N的值 #include<iostream> using namespace std; const int N= ...

  7. 算法学习——数字旋转方阵

    分析题目 将N*N矩阵分为四个部分,A,B,C,D,对这四个部分依次填充,内层同理 步骤如下:(非递归算法) 定义全局二维数组用于存放矩阵 宏定义一个常量N 编写full()函数用于填充二维数组 对A ...

  8. EntityComponentSystemSamples学习笔记

    前言 Unity官方发布的EntityComponentSystemSamples是非常不错的案例,值得深入学习以用于项目开发中. 一些特性介绍 ECS会出现好多新的特性需要了解一下: Generat ...

  9. OJ题目细菌实验分组c语言,C语言

    OJ.swust 西南科技ACM 0615 局部变量和子函数的运用(程序设计C实验三题目二) #include #include char isprime(int n){ if (n == 1){ r ...

最新文章

  1. 设置div中的div居中显示
  2. Python之网络图片爬取
  3. python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
  4. [HNOI2008]GT考试
  5. java inputstream api_Java 读取/转换 InputStream 为字符串
  6. HEXA机器人荣获CES Asia2018 创新奖
  7. (转载)Qt中使用cout输出的方法
  8. sendmail邮件服务器的基本建立过程
  9. 听云数据库管理平台NetopGO简介
  10. js定时器倒计时特效
  11. 如何用分库分表的9种分布式主键ID生成方案?附小技巧
  12. labelme 将自己数据集实现自动标注
  13. AI永远不可能产生意识
  14. 利用CRISPR基因编辑高效靶向诱变玉米农作物/植物核糖蛋白复合物的研究
  15. 智能车入门——‘教程引导’ <新手从零做车>
  16. 微信小程序手把手接入腾讯地图
  17. (winform)PDF文档或视频文件在线阅读或观看工具
  18. XStream使用记录
  19. Shakira feat Lil Wayne - Give it up to me
  20. Transwarp Inceptor介绍

热门文章

  1. 互联网从业必备-历史最全互联网黑话词汇表分享
  2. python爬取B站动态的评论总数(不含用户评论内容详情)
  3. 生产docker run 卡住没反应故障排查思路
  4. 分享 | 基于图像分类网络ResNet50_vd实现桃子分类
  5. Object(对象)中的属性
  6. Vue 中 Dep 和 Observer 的用法详解
  7. 我的身体为什以会这样?如何诊治?
  8. Java简单类、变量详解(概念和分类、声明、命名、初始化)
  9. C#开发:不规则裁切图片
  10. 计算机毕业论文怎样写系统的意义,毕业论文写作的目的意义及步骤-计算机论文...