java算法题解牛客BM99顺时针旋转矩阵示例
作者:itbird01 发布时间:2021-07-08 18:55:18
标签:java,算法,顺时针,旋转矩阵
题目描述
BM99 顺时针旋转矩阵
描述 有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。 数据范围:0<n<300,矩阵中的值满足0≤val≤1000
要求:空间复杂度 O(N^2),时间复杂度 O(N^2) 进阶:空间复杂度 O(1),时间复杂度 O(N^2)
示例1
输入:
[[1,2,3],[4,5,6],[7,8,9]],3
返回值:
[[7,4,1],[8,5,2],[9,6,3]]
解题思路
1.解法1:利用辅助数组,通过推导,我们知道每一位移动数字位置为:res[j][n-i-1] = mat[i][j];
2.解法2:我们观察,其实顺时针旋转90度,相等于,先按照做左对角线翻转数组,然后再按照列的中轴线翻转数组 实例分析:[[1,2,3],[4,5,6],[7,8,9]],3
实践代码
解法1
空间复杂度 O(N^2),时间复杂度 O(N^2)
import java.util.*;
public class Solution {
public int[][] rotateMatrix(int[][] mat, int n) {
int[][] res = new int[n][n]; //辅助数组
for (int i = 0; i < res.length; i++) {
for (int j = 0; j < res.length; j++) {
res[j][n-i-1] = mat[i][j];
}
}
return res;
}
}
解法2
空间复杂度 O(1),时间复杂度 O(N^2)
import java.util.*;
public class Solution {
public int[][] rotateMatrix(int[][] mat, int n) {
//按照做左对角线翻转数组
for (int i = 0; i < mat.length; i++) {
for (int j = i; j < mat.length; j++) {
int temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
//再按照列的中轴线翻转数组
for (int i = 0; i < mat.length / 2; i++) {
for (int j = 0; j < mat.length; j++) {
int temp = mat[j][i];
mat[j][i] = mat[j][n - i - 1];
mat[j][n - i - 1] = temp;
}
}
return mat;
}
}
来源:https://juejin.cn/post/7185356593779703867


猜你喜欢
- 本文实例讲述了C#简单输出日历的方法。分享给大家供大家参考。具体如下:用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是
- 当我们在做前后端分离的开发时,在使用fetch交换数据的时候,提示Access-Control-Allow-Origin跨域问题,解决方案跟
- 情况简介spring项目,controller异步调用service的方法,产生大量并发。具体业务:前台同时传入大量待翻译的单词,后台业务接
- 这篇文章主要介绍了Spring AOP AspectJ使用及配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等。一般都支持滑动并且下面有几个点,显
- 前言为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能
- Java8 HashMap键与Comparable接口最容易使 HashMap 发生哈希冲突的方法是什么呢?我们可以创建一个类,让它的哈希函
- Java多态成员访问的特点多态概要多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章
- 导入maven依赖<!-- https://mvnrepository.com/artifact/com.fasterxml.jack
- 原理 Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主
- 1、python的每一个语句的后面可以添加分号也可以不添加分号;在一行有多条语句的时候,必须使用分号加以区分2、查看Python版本号,在D
- 对于多线程,大家并不陌生,对于如何创建线程也是轻车熟路,对于使用new thread和实现runable接口的方式,不再多说。这篇博文我们介
- Java提供一种机制叫做序列化,通过有序的格式或者字节序列持久化java对象,其中包含对象的数据,还有对象的类型,和保存在对象中
- Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象。Gson里最重要的对象有2个Gs
- 前言前一篇文章我们熟悉了HikariCP连接池,也了解到它的性能很高,今天我们讲一下另一款比较受欢迎的连接池:Druid,这是阿里开源的一款
- 最近在做项目的时候,一直用一个叫做API的东西,controller注解我会写,这个东西我也会用,但是我确实不知道这个东西是个什么,有点神奇
- Android安全加密专题文章索引Android安全加密:对称加密Android安全加密:非对称加密Android安全加密:消息摘要Mess
- 前言文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍!!
- 一、概述在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInte
- 本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下#define _CRT_SECURE_NO_WARNIN