数组核心知识与算法常见遍历技巧总结

在算法题、笔试题和面试中,数组是出现频率最高的数据结构。

无论是:

  • 双指针
  • 前缀和
  • 矩阵遍历
  • 动态规划
  • 模拟类问题

都离不开对数组的熟练掌握。

本文将系统梳理:

  • 数组基础知识
  • 长度获取的区别总结
  • 二维数组结构理解
  • 常见算法中的特殊遍历方式(重点)
  • 对角线遍历规律总结

一、数组基础知识回顾

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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐