02_稀疏数组
01_概念
02_使用场景
03_压缩步骤
04_Java实现
05_Java实现(稠密数组压缩成稀疏数组、稀疏数组解压成稀疏数组)
package DataStructureReview;
public class SparseArrayDemo {
public static void main(String[] args) {
//准备一个9*9的数组
int[][] arr = new int[4][4];
arr[0] = new int[]{1, 0, 0, 0, 0, 0, 0};
arr[1] = new int[]{0, 2, 0, 0, 88, 0, 0};
arr[2] = new int[]{0, 0, 3, 0, 0, 0, 0};
arr[3] = new int[]{0, 0, 0, 4, 0, 0, 9};
int[][] sparse = UtilityClass.dense2sparse(arr);
UtilityClass.printArray(sparse);
System.out.println("=========================");
UtilityClass.printArray(UtilityClass.sparse2dense(sparse));
}
}
class UtilityClass {
//将稠密数组压缩成稀疏数组,默认无效数据为0
public static int[][] dense2sparse(int[][] arr) {
//1.判断是否为有效压缩
int rowNum = arr.length;
int colNum = arr[0].length;
int num = 0;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
if (arr[i][i1] != 0) {
num++;
}
}
}
if ((rowNum * colNum / 3 - 1) < num) {
throw new RuntimeException("压缩无效,无法进行压缩");
}
//2.将稠密数组压缩成稀疏数组
int[][] spaArr = new int[num + 1][3];
spaArr[0] = new int[]{rowNum, colNum, num};
int cur = 1;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
if (arr[i][i1] != 0) {
spaArr[cur][0] = i;
spaArr[cur][1] = i1;
spaArr[cur][2] = arr[i][i1];
cur++;
}
}
}
return spaArr;
}
//打印2维数组
public static void printArray(int[][] arr) {
int rowNum = arr.length;
int colNum = arr[0].length;
for (int i = 0; i < rowNum; i++) {
for (int i1 = 0; i1 < colNum; i1++) {
System.out.printf("%d ", arr[i][i1]);
}
System.out.println();
}
}
//将稀疏数组还原成稠密数组
public static int[][] sparse2dense(int[][] arr) {
int row_num = arr[0][0];
int clo_num = arr[0][1];
int[][] dense_arr = new int[row_num][clo_num];
int rowNum = arr.length;
int colNum = arr[0].length;
for (int i = 1; i < rowNum; i++) {
int row = arr[i][0];
int col = arr[i][1];
int value = arr[i][2];
dense_arr[row][col] = value;
}
return dense_arr;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界