稀疏数组问题
当一个二维数组中大部分数据都是0,对这个数组直接进行存储会很浪费空间,因此利用稀疏数组进行压缩,稀疏数组第一行的第一个元素是原二维数组行数。,第一行的第二个元素是原二维数组的列数,如图为11行11列有2个有效值。
普通二维数组-->稀疏数组
思路:创建一个11*11的普通二维数组arr1,其中arr1[1][2]=1,arr1[2][3]=2,其余元素均为0。
Java代码:
//原数组11*11int[][] array1 = new int[11][11];int sum=0;//非0元素的个数array1[1][2] = 1;array1[2][3] = 2;for (int[] row : array1) {for (int data : row) {System.out.print(data+"\t");if(data!=0){sum++;}}System.out.println('\n');}//创建稀疏数组int[][] array2 = new int[sum+1][3];array2[0][0]=11;array2[0][1]=11;array2[0][2]=sum;int count=0;for(int i=0;i<11;i++){for(int j=0;j<11;j++){if(array1[i][j]!=0){count++;array2[count][0]=i;array2[count][1]=j;array2[count][2]=array1[i][j];}}}//打印稀疏数组for (int[] row : array2) {for (int data : row) {System.out.print(data+"\t");}System.out.println('\n');}
稀疏数组-->还原成普通二维数组
思路:首先从稀疏数组读取到原数组是几行几列的,接着读出有效值所在的行列并赋值给我们新创建的数组即可
Java代码:
//还原,稀疏数组->原数组int m=array2[0][0];//11int n=array2[0][1];//11int[][] array3=new int[m][n];for(int i=1;i<sum+1;i++){//遍历稀疏数组array3[array2[i][0]][array2[i][1]]=array2[i][2];}//打印还原的数组for (int[] row : array3) {for (int data : row) {System.out.print(data+"\t");}System.out.println('\n');}
汇总代码:
package SparseArray;
public class SparseArray {public static void main(String[] args) {//原数组11*11int[][] array1 = new int[11][11];int sum=0;//非0元素的个数array1[1][2] = 1;array1[2][3] = 2;for (int[] row : array1) {for (int data : row) {System.out.print(data+"\t");if(data!=0){sum++;}}System.out.println('\n');}//创建稀疏数组int[][] array2 = new int[sum+1][3];array2[0][0]=11;array2[0][1]=11;array2[0][2]=sum;int count=0;for(int i=0;i<11;i++){for(int j=0;j<11;j++){if(array1[i][j]!=0){count++;array2[count][0]=i;array2[count][1]=j;array2[count][2]=array1[i][j];}}}//打印稀疏数组for (int[] row : array2) {for (int data : row) {System.out.print(data+"\t");}System.out.println('\n');}//还原,稀疏数组->原数组int m=array2[0][0];//11int n=array2[0][1];//11int[][] array3=new int[m][n];for(int i=1;i<sum+1;i++){//遍历稀疏数组array3[array2[i][0]][array2[i][1]]=array2[i][2];}//打印还原的数组for (int[] row : array3) {for (int data : row) {System.out.print(data+"\t");}System.out.println('\n');}}
}
每日打卡一道数据结构与算法!!冲刺一百天,我要进大厂!!冲呀!!