tag数组-刷题预备知识-0.5 二维数组概述 + lt.48旋转图像 3

二, 二维数组

2.1. 二维数组简介

二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组

所以二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,我们可以将它看作一个矩阵,并处理矩阵的相关问题。

示例如下:

类似一维数组,对于一个二维数组 A = [[1, 2, 3, 4],[2, 4, 5, 6],[1, 4, 6, 8]] ,计算机同样会在内存中申请一段 连续 的空间,并记录第一行数组的索引位置,即 A[0][0]的内存地址,它的索引与内存地址的关系如下图所示。

注意,实际数组中的元素由于类型的不同会占用不同的字节数,因此每个方格地址之间的差值可能不为 1。

实际题目中,往往使用二维数组处理矩阵类相关问题,包括矩阵旋转、对角线遍历,以及对子矩阵的操作等。

2.2. LeetCode 48. 旋转图像(Medium)

[案例需求]
Category Difficulty Likes Dislikes
algorithms Medium (72.83%) 887 -

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入: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]]

示例 3:

输入:matrix = [[1]]
输出:[[1]]

示例 4:

输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]

提示:

matrix.length == n
matrix[i].length == n
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

[思路分析]
0. 这道题虽然是中等, 但是实际解决起来并不难, 主要思路是先对二维矩阵进行转置, 然后(镜像翻转), 即在这个基础上交换第一列和最后一列, 第二列和倒数第二列....一直到二维矩阵的中心列--> 第length/2列处(length为二维矩阵的列数)即可.

  1. 在实现过程中需要注意的一点: 在矩阵的转置过程中, 外层是遍历行, 内层是遍历列, 那么在内循环遍历列时, 我们遍历到哪里结束呢? 对角线处! j可以从0到i(下对角线), 也可以从 i到 arr.length-1(上对线);
  2. 同样, 在交换两列的过程中, 内层循环次数是length/2次, 同样可以使从 0到length/2;
  3. 很暴力的解法对吧, 但也是我们这些学弱的无奈啦.

[代码实现]

//旋转图像
class Solution {
    public static void rotate(int[][] matrix) {
        //先转置再进行列交换
        //1. 矩阵的行数
        int row = matrix.length;
        //存储转置
        //转置矩阵
        for (int i = 0; i < row; i++) {
            for (int j = i; j < matrix[i].length; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        //转置完了, 再进行列交换
        for(int i=0; i < row; i++){
            for(int j=0; j < row/2; j++){
                //列索引
                int col = matrix[i].length -1;
                int temp1 =  matrix[i][j];
                matrix[i][j] = matrix[i][col-j];
                matrix[i][col-j] = temp1;
            }
        }
        //测试:
        for( int[] arr : matrix){
            for(int x : arr){
                System.out.print(x+",");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };
        rotate(matrix);
    }
}

在这里插入图片描述

需要进一步优化! 优化方向: 四角旋转法

待补充.
四角旋转法

通过本题复习到的知识点:

  1. 矩阵的转置:
    • 注意方阵的非方阵的转置方法是稍有不同的;
    • 方阵的转置可以利用对角线两侧元素交换, 可以做到原地转换, 空间复杂度为 O(1)
    • 而非方阵的转置(例如 aXb的矩阵)稍微麻烦一点, 要先创建一个bxa的矩阵, 把(i,j)处的元素放置到新矩阵的(j, i)处
    • 在这里插入图片描述
posted @   青松城  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示