稀疏数组和队列
问题描述:当一个数组的大部分的元素为0,或者是同一个值时,可以使用稀疏数组来保存
处理方法:
- 记录数组一共有几行几列
- 把不同值的元素的行列及值记录在小规模的数组中,缩小程序的规模
实例:处理下图的二维数组
二维数组转稀疏数组
第一步:遍历二维数组,找到有效值的个数sum(不为0)
第二步:创建稀疏数组sparseArr in【sum+1】【3】
第三步:将二维数组的有效数据存进稀疏数组
稀疏数组转二维数组
第一步:先读取稀疏数组的第一行,根据存储的行数列数创建原始二维数组
第二步:读取后几行数组,赋值给原始二维数组
package com.wei;
public class sparseArr {
public static void main(String[] args) {
int[][] arr= {{0,0,1,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,5,0,0,0},{0,0,0,0,0,0,0}};//初始数组
int row = arr.length;//行数
int col = arr[0].length;//列数
int sum = 0;//有效数的个数
for(int i = 0 ;i<row ;i++){//循环二维数组
for(int j = 0; j< col; j++){
if(arr[i][j] != 0){
sum+=1;
}
}
}
int[][] sparseArr = new int[sum+1][3];//创建稀疏数组
//首行赋值
sparseArr[0][0] = row;
sparseArr[0][1] = col;
sparseArr[0][2] = sum;
int count = 0;//记录记录到哪一行
for(int i = 0 ;i<row ;i++){//稀疏数组赋值
for(int j = 0; j< col; j++){
if(arr[i][j] != 0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=arr[i][j];
}
}
}
//输出稀疏数组
for (int i = 0 ;i<sparseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
//还原原数组
int arr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i <sparseArr.length ; i++) {
arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2] ;
}
for(int[] row1:arr2){
for (int data:row1){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
结果:
4 7 2
0 2 1
2 3 5
0 0 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 5 0 0 0
0 0 0 0 0 0 0