左神算法基础class3—题目6旋转正方形矩阵

2023-12-07 19:18

本文主要是介绍左神算法基础class3—题目6旋转正方形矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

左神算法基础class3—题目6旋转正方形矩阵

  • 1.题目
  • 2.分析
  • 3.核心代码
  • 4.完整代码
  • 5.输出结果

1.题目

【题目】 给定一个整型正方形矩阵matrix,请把该矩阵调整成
顺时针旋转90度的样子。
【要求】 额外空间复杂度为O(1),不使用辅助数组。

在这里插入图片描述

2.分析

分析:题目给定的是正方形矩阵,考虑把矩阵看成回字形结构,由外到内按层进行旋转,先外层后内层。与题目5思路相同规定左上角和右下角的点为(a,b)(c,d)。由于不能使用辅助数组,旋转会覆盖之前的数所以需要一个temp变量暂存某个数。
(1)暂存数字1后通过a,b,c,d四个变量对1,4,16,13四个数按照黑色箭头的顺序逐个覆盖掉之前的数;
(2)对a行上的方向依次把2,8,15,9与(1)步骤相似的旋转覆盖,3,12,14,5也是如此,这样最外层的12个数旋转完成;
(3)a++,b++,c–,d–后对内层6,7,11,10相同操作。
tips:最外层每行4个数,有三个起始点1,2,3,内层每行2两个数只有一个起始点6,那么d-b表示需要的起始点个数即每层需要循环多少次。本题外层循环三次可以旋转12个数,内层四个数循环一次。

在这里插入图片描述

3.核心代码

(1)初始化a,b,c,d。

int a = 0,b = 0,c = height - 1,d = width - 1;

(2)每层旋转的代码,通过i和a,b,c,d控制数组的位置,单纯考察代码能力

void rotate_matrix(int arr[][width],int a,int b,int c,int d)
{int times = d - b;for(int i = 0;i < times;i++){int temp = arr[a][b + i];arr[a][b + i] = arr[c - i][b];arr[c - i][b] = arr[c][d - i];arr[c][d - i] = arr[a + i][d];arr[a + i][d] = temp;}
}

(3)通过a,c两个变量控制一共需要旋转的层数。左上角和右下角的点每层旋转过后逐渐向中心移动一格,由于题目给定是正方形,那么两个点只能重合不可能斜错,使用两个点的横坐标a,c控制旋转层数。

while(a < c){rotate_matrix(arr,a++,b++,c--,d--);}

4.完整代码

#include<iostream>
#define height 4
#define width 4
using namespace std;void rotate_matrix(int arr[][width],int a,int b,int c,int d)
{int times = d - b;for(int i = 0;i < times;i++){int temp = arr[a][b + i];arr[a][b + i] = arr[c - i][b];arr[c - i][b] = arr[c][d - i];arr[c][d - i] = arr[a + i][d];arr[a + i][d] = temp;}
}void print(int arr[][width])
{//打印输出for(int i = 0;i < height;i++){for(int j = 0;j < width;j++){cout<<arr[i][j]<<" " ;}cout<<endl;}
}
int main()
{//int arr[height][width] = {1,2,3,4,5,6,7,8,9};int arr[height][width] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int a = 0,b = 0,c = height - 1,d = width - 1;while(a < c){rotate_matrix(arr,a++,b++,c--,d--);}print(arr);system("pause");return 0;
}

5.输出结果

在这里插入图片描述

这篇关于左神算法基础class3—题目6旋转正方形矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467048

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字