稀疏数组: 原本数组出现0的(某个值)过多,空间浪费 ,采用稀疏数组的方式去存储数据
稀疏数组:原数组有效值+1 行 三列
第一行: 记录原数组 的 行、列、有效值的个数
第二行到最后一行: 记录 原数组的有效值 的下标 与值
package com.qf.sparsearrydemo;
//稀疏数组 用于二维数组 0比较多的
/**
* 第一行 原本数组 的行数 列数 有效值(非0)
* 从第二行开始 原本数组有效值的下标 值
*/
public class SparseArray {
public static void main(String[] args) {
//统计非0 个数
int count = 0;
//准备数据
int[][] arr = new int[][]{{0, 2, 3}, {4, 0, 5}, {6, 5, 7}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
if (arr[i][j] != 0) {
count++;
}
}
System.out.println();
}
System.out.println("1.数据准备完毕 准备填充入sparseArray数组");
//稀疏数组 初始化稀疏数组
int[][] sparseArray = new int[count + 1][3];
sparseArray[0][0] = arr.length; //第一行 存储原数组多少行
sparseArray[0][1] = arr[0].length;// 存储原数组多少列
sparseArray[0][2] = count;
System.out.println("2.将数组插入稀疏数组");
int sparseArrayCount = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
sparseArrayCount++;
sparseArray[sparseArrayCount][0] = i;
sparseArray[sparseArrayCount][1] = j;
sparseArray[sparseArrayCount][2] = arr[i][j];
}
}
}
System.out.println("3.数据已经插入 现在遍历");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(sparseArray[i][j]);
}
System.out.println();
}
System.out.println("4.遍历完成 现在将数据sparse数组转换为 二维数组");
int[][] new_arr = new int[sparseArray[0][0]][sparseArray[0][1]];
//赋值 原本数组大小 已经声明 现在只要将数据 拆入即可
for (int i = 1; i < sparseArray.length; i++) {
new_arr[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("5.新数组插入完毕,遍历");
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[i].length; j++) {
System.out.print(new_arr[i][j]);
}
System.out.println();
}
}
}
核心代码:
//初始化,要有个计数器 记录原数组有效值个数
//稀疏数组 初始化稀疏数组
int[][] sparseArray = new int[count + 1][3];
//稀疏数组 第一行 的值,以及其对应的意义
sparseArray[0][0] = arr.length; //第一行 存储原数组多少行
sparseArray[0][1] = arr[0].length;// 存储原数组多少列
sparseArray[0][2] = count;
//遍历原数组 并将原数组中有效值的下标与值存入 稀疏数组(从第二行开始)
int sparseArrayCount = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
sparseArrayCount++;
sparseArray[sparseArrayCount][0] = i;
sparseArray[sparseArrayCount][1] = j;
sparseArray[sparseArrayCount][2] = arr[i][j];
}
}
}
//遍历稀疏数组,原数组有效值+1行 3列
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(sparseArray[i][j]);
}
System.out.println();
}
//还原 将sparseArray 转换成对应的二维数组 sparseArray内存储的下标就是二维数组对应的下标
int[][] new_arr = new int[sparseArray[0][0]][sparseArray[0][1]];
//赋值 原本数组大小 已经声明 现在只要将数据 拆入即可
for (int i = 1; i < sparseArray.length; i++) {
new_arr[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}