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为二维矩阵的列数)
即可.
- 在实现过程中需要注意的一点: 在矩阵的转置过程中, 外层是遍历行, 内层是遍历列, 那么在内循环遍历列时, 我们遍历到哪里结束呢? 对角线处! j可以从0到i(下对角线), 也可以从 i到 arr.length-1(上对线);
- 同样, 在交换两列的过程中, 内层循环次数是length/2次, 同样可以使从 0到length/2;
- 很暴力的解法对吧, 但也是我们这些学弱的无奈啦.
[代码实现]
//旋转图像
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);
}
}
需要进一步优化! 优化方向:
四角旋转法
待补充.
四角旋转法
通过本题复习到的知识点:
- 矩阵的转置:
- 注意方阵的非方阵的转置方法是稍有不同的;
- 方阵的转置可以利用对角线两侧元素交换, 可以做到原地转换, 空间复杂度为 O(1)
- 而非方阵的转置(例如 aXb的矩阵)稍微麻烦一点, 要先创建一个bxa的矩阵, 把(i,j)处的元素放置到新矩阵的(j, i)处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)