• 【21天学习挑战赛】图像的旋转问题(二维数组)



    活动地址:CSDN21天学习挑战赛

    怕什么真理无穷,进一步有一份的欢喜。

    【21天学习挑战赛】图像的旋转问题(二维数组)

    ✌我为什么参与挑战赛

    1,机缘

    读到研一了,暑假器件打开私信发现这个挑战赛就鼓起勇气参加了。

    2,期待的收获

    A, 本人在华南理工大学攻读专硕,目前研究方向是图像恢复,从事深度学习相关工作,目标是从事Java后端开发。
    B, 期待您的反馈,如果有什么不对的地方,欢迎指正!
    C, 期待认识志同道合的领域同行或技术交流。
    如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

    🍉什么是二维数组?

    二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组。所以在Java中二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,我们可以将它看作一个矩阵,并处理矩阵的相关问题
    在这里插入图片描述

    💬图像的旋转的定义

    指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。当然这个点通常就是图像的中心。既然是按照中心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变。
    在这里插入图片描述

    🍵 图像的旋转的步骤

    1. 如果是顺时针旋转90°:一定是先对角线翻转,再水平翻转
    2. 如果是逆时针旋转90°:一定是先水平翻转,再对角线翻转

    斜对角翻转步骤
    红色为分割线,按照橙色线进行数据绿色的成对交换(matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j])
    在这里插入图片描述
    水平翻转步骤
    红色为分割线,按照橙色线进行数据绿色的成对交换(matrix[i][j], matrix[i][length/2- j] = matrix[i][length/2- j] ,matrix[i][j])
    在这里插入图片描述

    ✍️ 算法实现

    因为我们只需要按照写好对角线翻转和水平翻转就可以了

    ✨ LeetBook题目

    旋转矩阵
    给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?

    实例

    给定 matrix =
    [
    [ 5, 1, 9,11],
    [ 2, 4, 8,10],
    [13, 3, 6, 7],
    [15,14,12,16]
    ],
    原地旋转输入矩阵,使其变为:
    [
    [15,13, 2, 5],
    [14, 3, 4, 1],
    [12, 6, 8, 9],
    [16, 7,10,11]
    ]
    作者:力扣 (LeetCode)
    链接:https://leetcode.cn/leetbook/read/array-and-string/clpgd/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    package com.wpc.leetbook.matrix_;
    
    import org.junit.jupiter.api.Test;
    
    import java.util.Arrays;
    
    public class Solution {
        /**
         * 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
         * 不占用额外内存空间能否做到?
         * 思路:
         * 如果是顺时针旋转90°
         * 一定是先对角线翻转,再水平翻转
         * 如果是逆时针旋转90°
         * 一定是先水平翻转,再对角线翻转
         *
         * @param matrix
         */
        public void rotate(int[][] matrix) {
            //先进行斜对角翻转
            int length = matrix.length;
            int temp = 0;
            for (int i = 0; i < length; i++) {
                for (int j = i + 1; j < length; j++) {
                    temp = matrix[i][j];
                    matrix[i][j] = matrix[j][i];
                    matrix[j][i] = temp;
                }
            }
            //在进行水平翻转
            int half_length = matrix.length >> 1;
            int len = length - 1;
            for (int i = 0; i < length; i++) {
                for (int j = 0; j < half_length; j++) {
                    temp = matrix[i][j];
                    matrix[i][j] = matrix[i][len - j];
                    matrix[i][len - j] = temp;
                }
            }
        }
        @Test
        public void test() {
            int[][] matrix = new int[][]{{5, 1, 9, 11}, {2, 4, 8, 10}, {13, 3, 6, 7}, {15, 14, 12, 16}};
            rotate(matrix);
            System.out.println(Arrays.deepToString(matrix));
        }
    }
    
    
    • 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
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    提交结果
    在这里插入图片描述

    如果觉得对你有帮助的话:
    👍 点赞,你的认可是我创作的动力!
    ⭐️ 收藏,你的青睐是我努力的方向!
    ✏️ 评论,你的意见是我进步的财富!

    ​​

  • 相关阅读:
    linux系统定时任务与延迟任务
    游戏 小代码
    C#使用IronPython调用Python脚本实例
    最远点采样 — D-FPS与F-FPS
    Java基础常见面试题总结
    mac添加Chrome插件的方法
    如何使用轻量应用服务器自带的Cloudreve应用镜像搭建属于自己的云网盘?
    Dubbo源码篇07---SPI神秘的面纱---原理篇---下
    微信小程序 封装请求api
    在 Spring 生态中玩转 RocketMQ
  • 原文地址:https://blog.csdn.net/qq_41080854/article/details/126145078