Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

    • 搜索

    • 二分查找

    • 排序

    • 边界判断

      • 54.螺旋矩阵
      • 498.对角线遍历
      • 59.螺旋矩阵Ⅱ
      • 48. 旋转图像
        • 1.外圈旋转
        • 2.优化
      • 6425. 找到最长的半重复子字符串
      • 135. 分发糖果
      • 715. Range 模块
      • 剑指offer13
    • 双指针法

    • 连续子数组

    • 差分数组

    • 模拟

    • 区间问题

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数组
  • 边界判断
phan
2023-05-26
目录

48. 旋转图像

# 48. 旋转图像 (opens new window)

# 1.外圈旋转

解题思路:观察每次旋转后每个正方形的外层数组,可以发现上边旋转到了右边,右边旋转到了下边...因此每次遍历进行旋转变换时,仅旋转最外圈的元素。然后递归缩小圈的范围处理内圈。

开辟一个缓存数组空间,缓存每次要写入那条边的元素。

class Solution {
    public void rotate(int[][] matrix) {
        round(matrix,0,0,matrix.length-1);
    }
    public void round(int[][] matrix,int x,int a,int b){
        int limit=matrix.length/2;
        if(x>=limit) return;
        int step=0;
        int[] nums=new int[b-a+1];
        int n1=matrix[x][a],n2=matrix[x][b],n3=matrix[x+b-a][b],n4=matrix[x+b-a][a];
        while(step<4){
            for(int i=0;i<=b-a;i++){
                if(step==0){
                    nums[b-a-i]=matrix[x+b-a-i][b];
                    matrix[x+b-a-i][b]=matrix[x][b-i];
                }
                if(step==1){
                    int temp=matrix[x+b-a][a+i];
                    matrix[x+b-a][a+i]=nums[b-a-i];
                    nums[b-a-i]=temp;
                }
                if(step==2){
                    int temp=matrix[x+i][a];
                    matrix[x+i][a]=nums[b-a-i];
                    nums[b-a-i]=temp;
                }
                if(step==3){
                    matrix[x][b-i]=nums[b-a-i];
                }
            }
            step++;
        }
        matrix[x][a]=n4;
        matrix[x][b]=n1;
        matrix[x+b-a][b]=n2;
        matrix[x+b-a][a]=n3;
        round(matrix,x+1,a+1,b-1); 
    }
}
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 2.优化

解题思路:交换内外层遍历顺序,每次循环交换四条边上对应点的位置。使用一个变量保存四个数交换时的中间状态,不需要开辟一个边大小的数组。

class Solution {
    public void rotate(int[][] matrix) {
        round(matrix,0,0,matrix.length-1);
    }
    public void round(int[][] matrix,int x,int a,int b){
        int limit=matrix.length/2;
        if(x>=limit) return;
        for(int i=0;i<=b-a-1;i++){
            //右
            int temp=matrix[x+i][b];
            matrix[x+i][b]=matrix[x][a+i];
            //下
            int swp=matrix[x+b-a][b-i];
            matrix[x+b-a][b-i]=temp;
            temp=swp;
            //左
            swp=matrix[x+b-a-i][a];
            matrix[x+b-a-i][a]=temp;
            temp=swp;
            //上
            matrix[x][a+i]=temp;
        }
        round(matrix,x+1,a+1,b-1); 
    }
}
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
编辑 (opens new window)
#Leetcode#边界判断
上次更新: 2023/12/15, 15:49:57
59.螺旋矩阵Ⅱ
6425. 找到最长的半重复子字符串

← 59.螺旋矩阵Ⅱ 6425. 找到最长的半重复子字符串→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式