【算法】数组及特殊遍历方法(java)
·
数组核心知识与算法常见遍历技巧总结
在算法题、笔试题和面试中,数组是出现频率最高的数据结构。
无论是:
- 双指针
- 前缀和
- 矩阵遍历
- 动态规划
- 模拟类问题
都离不开对数组的熟练掌握。
本文将系统梳理:
- 数组基础知识
- 长度获取的区别总结
- 二维数组结构理解
- 常见算法中的特殊遍历方式(重点)
- 对角线遍历规律总结
一、数组基础知识回顾
1️⃣ 数组初始化
(1)指定长度初始化
int[] a = new int[10];
- 默认值为 0(基本类型)
- 长度固定,不可变
(2)直接赋值初始化
int[] b = {1, 2, 3};
编译器自动推导长度。
(3)携带变量初始化
int c = 10;
int[] d = new int[c + 1];
数组长度可以是表达式。
(4)批量赋值
Arrays.fill(a, 0);
常用于:
- 初始化 DP 数组
- 重置数组
- 构造哨兵数组
(5)获取数组长度
int len = a.length;
⚠ 注意:length 是属性,不是方法。
二、size()、length、length() 的区别总结
这是面试高频易错点。
| 对比项 | size() | length | length() |
|---|---|---|---|
| 适用对象 | 集合类(List、Set、Map) | 数组 | String |
| 类型 | 方法 | 属性 | 方法 |
| 示例 | list.size() | arr.length | str.length() |
| 含义 | 元素个数 | 数组容量 | 字符个数 |
口诀:
集合用 size()
数组用 length
字符串用 length()
三、二维数组的本质理解
二维数组本质是:
数组的数组
int[][] matrix = new int[n][n];
内存结构理解为:
matrix → 行数组
每一行 → 一个一维数组
因此:
matrix.length→ 行数matrix[i].length→ 第 i 行列数
动态二维数组:
// 初始容量为0
int[][] nums = new int[0][2];
// 需要添加时动态扩容
nums = Arrays.copyOf(nums, nums.length + 1);
nums[nums.length - 1] = new int[]{1, 2};
四、算法常见二维数组遍历技巧(重点)
在算法题中,矩阵遍历经常变形考察。
核心在于:
找到“行列坐标之间的规律关系”
五、对角线遍历规律总结
假设是一个 n × n 矩阵。
1️⃣ 主对角线
规律:
行号 = 列号
即:
matrix[i][i]
代码:
public static int[] getMainDiagonal(int[][] matrix) {
int n = matrix.length;
int[] mainDiagonal = new int[n];
for (int i = 0; i < n; i++) {
mainDiagonal[i] = matrix[i][i];
}
return mainDiagonal;
}
2️⃣ 副对角线
规律:
行号 + 列号 = n - 1
即:
matrix[i][n - 1 - i]
代码:
public static int[] getAntiDiagonal(int[][] matrix) {
int n = matrix.length;
int[] antiDiagonal = new int[n];
for (int i = 0; i < n; i++) {
antiDiagonal[i] = matrix[i][n - 1 - i];
}
return antiDiagonal;
}
六、主对角线平行的所有对角线
理解核心:
主对角线满足:
row - col = 0
因此:
所有与主对角线平行的线满足:
row - col = 常数
1️⃣ 主对角线下方
public static List<List<Integer>> getDiagonalsBelowMain(int[][] matrix) {
int n = matrix.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> diagonal = new ArrayList<>();
for (int j = 0; j < n - i; j++) {
diagonal.add(matrix[i + j][j]);
}
result.add(diagonal);
}
return result;
}
规律:
行 - 列 = 固定正数
2️⃣ 主对角线上方
public static List<List<Integer>> getDiagonalsAboveMain(int[][] matrix) {
int n = matrix.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 1; i < n; i++) {
List<Integer> diagonal = new ArrayList<>();
for (int j = 0; j < n - i; j++) {
diagonal.add(matrix[j][i + j]);
}
result.add(diagonal);
}
return result;
}
规律:
行 - 列 = 固定负数
七、副对角线平行的所有对角线
副对角线满足:
row + col = n - 1
因此平行线满足:
row + col = 常数
1️⃣ 副对角线下方
public static List<List<Integer>> getDiagonalsBelowAnti(int[][] matrix) {
int n = matrix.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> diagonal = new ArrayList<>();
for (int j = 0; j < n - i; j++) {
diagonal.add(matrix[i + j][n - 1 - j]);
}
result.add(diagonal);
}
return result;
}
2️⃣ 副对角线上方
public static List<List<Integer>> getDiagonalsAboveAnti(int[][] matrix) {
int n = matrix.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 1; i < n; i++) {
List<Integer> diagonal = new ArrayList<>();
for (int j = 0; j < n - i; j++) {
diagonal.add(matrix[j][n - 1 - i - j]);
}
result.add(diagonal);
}
return result;
}
八、算法核心思想总结
矩阵遍历本质只有两种核心关系:
① 主对角线方向
row - col = 常数
② 副对角线方向
row + col = 常数
你只要记住这两条公式,任何对角线问题都能推出。
九、写算法时的建议
✔ 优先找数学关系
✔ 画 3×3 或 4×4 举例验证
✔ 不要死记代码
✔ 所有矩阵题都可以转为坐标关系问题
十、总结
本文系统整理了:
- 数组初始化方式
- 长度获取区别
- 二维数组结构理解
- 主对角线 / 副对角线规律
- 平行对角线遍历技巧
数组是算法的地基。
对角线规律,是矩阵题的核心突破口。
核心理解:
row - col
row + col
更多推荐



所有评论(0)