【Java数据结构】—— 二维数组

二维数组

在Java中,二维数组是一种特殊类型的数组,它实质上是一个数组的数组,即每个元素都是一个一维数组。二维数组常用来表示表格状的数据结构,如矩阵。下面是如何声明、初始化和访问二维数组的示例:

声明二维数组

首先,你需要声明一个二维数组。声明时可以指定数组的行数(外层数组的大小),但列数(内层数组的大小)可以在初始化时指定或动态确定。

java 复制代码
// 声明一个二维数组,没有指定行数和列数
int[][] matrix;

// 声明一个二维数组,指定行数但未指定列数
int[][] matrixWithRows = new int[3][];

// 声明并初始化一个二维数组,指定行数和列数
int[][] matrixInitialized = new int[3][4];

初始化二维数组

二维数组可以通过多种方式进行初始化:

静态初始化

直接在声明时给数组的每个元素赋值。

Java 复制代码
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
动态初始化

只指定数组的长度,然后逐个或逐行地给数组元素赋值。

Java 复制代码
int[][] matrix = new int[3][4];

// 逐个赋值(较少见,因为不够直观)
matrix[0][0] = 1;
matrix[0][1] = 2;
// ... 其他元素以此类推

// 或者逐行赋值
matrix[0] = new int[]{1, 2, 3, 4};
matrix[1] = new int[]{5, 6, 7, 8};
matrix[2] = new int[]{9, 10, 11, 12};

访问二维数组的元素

访问二维数组的元素使用两个索引,第一个表示行,第二个表示列。

Java 复制代码
int value = matrix[1][2]; // 访问第二行第三列的元素
System.out.println(value); // 输出:6

遍历二维数组

遍历二维数组通常使用嵌套循环。

java 复制代码
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println(); // 换行
}

算法题目练习

题目来自力扣:数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

【练习一】旋转矩阵,给一个N*N的二维矩阵,将其顺时针旋转九十度后输出

观察下标变化,顺时针旋转 90 度后会发现

第I行会变为倒数第I列

第J列会变为第J行

所以对应关系为[I,J] -> [J,N-1-I] (这里为N-1是因为坐标从0开始所以最大的坐标为N-1)

旋转时每个坐标都有与之对应的3个坐标点,总共4个坐标点相互互换位置

I,J\] -\> \[J,N-1-I\] -\> \[N-1-I,N-1-J\] -\> \[N-1-J,I\] -\> \[I,J

所以我们只需要遍历 1/4 的坐标,然后变动对应的 4 组坐标 即可实现全部坐标的替换

java 复制代码
public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < (n + 1) / 2; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }

【练习二】编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

每次找到等于零的那一个把对应的行和列都置零即可,但是会出现一个问题就是到最后所有的元素都变成零了;

因此,既然打算将整行和整列清零,因此并不需要标记录它是cell[2][4](行2,列4),只需要知道行2有个元素为0,列4有个元素为0.不管怎样,整行和整列都要清零,在记录之后再同意进行归零操作,又何必要记录零元素的确切位置?

java 复制代码
public static void setZeroes(int[][] matrix) {
        int rowSize = matrix.length;
        int colSize = matrix[0].length;
        boolean [] rows = new boolean[rowSize];
        boolean[] cols = new boolean[colSize];

        //第一次遍历,找出含0的行号和列号,记录到数组中,。
        for (int i = 0; i < rowSize; i++) {
            for (int j = 0; j < colSize; j++) {
                if(matrix[i][j] == 0){
                    rows[i] = true;
                    cols[j] = true;
                }
            }
        }
        //第二次遍历,修改
        for (int i = 0; i < rowSize; i++) {
            for (int j = 0; j < colSize; j++) {
                if(rows[i] || cols[j]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
相关推荐
Lionel_SSL2 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
记得开心一点嘛2 小时前
手搓Springboot
java·spring boot·spring
Greedy Alg3 小时前
LeetCode 142. 环形链表 II
算法
睡不醒的kun3 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
老华带你飞3 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc3 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵3 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
先做个垃圾出来………3 小时前
残差连接的概念与作用
人工智能·算法·机器学习·语言模型·自然语言处理
华仔啊4 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端
SuperCandyXu5 小时前
P3205 [HNOI2010] 合唱队-普及+/提高
c++·算法·洛谷