稀疏数组
每日一道算法题,本来打算每日一道LeetCode,结果第二题感觉就吃力了,也不算放弃吧,我想还是基础知识不牢固,加之其他原因吧,虽然是撸代码的,但是家庭、工作性质等种种原因吧,现在只能是热爱了,扯远了,我觉得有热爱就够了,现在有一份工作,能够支撑你的家庭、事业,并且还能留有余地让你干一些自己热爱的事情,足以,不说了,扯远了,还是回归正题,今天是一道算法题
- 稀疏数组,顾名思义就是被压缩了的数组,当一个数组中大部分元素为0或者同一个值得时候,我们可以使用稀疏数组来保存该数组,从而降低了原数组的规模
- 它的处理方式就是,稀疏数组的第0行记录原数组有几行几列,有多少个不同值
- 然后稀疏数组的每一行记录具有不同值的行、列和值
package Arrays;
public class SparseArray {
public static void main(String[] args) {
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
// 循环遍历行
for(int[] row : chessArr){
// 循环遍历列
for(int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println("==================================");
// 二位数组转换稀疏数组
//1、遍历非0个数,定义稀疏数组
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0){
sum++;
}
}
}
// 稀疏数组的大小为sum+1行 3列
// 第0行的第1列存放原数组行数 第0行第2列存放原数组列数 第0行第3列存放原数组非0总数
int sparseArray[][] = new int[sum+1][3];
sparseArray[0][0] = chessArr.length;
sparseArray[0][1] = chessArr.length;
sparseArray[0][2] = sum;
// 遍历非0数据放在稀疏数组中
int count = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
// 这里先++ 让数组从第一行开始赋值
count ++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArr[i][j];
}
}
}
//输出稀疏数组
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
}
// 稀疏数组转二维数组
// 1、先读取第一行,创建原始数组
// 2、遍历稀疏数组 原数组进行赋值
System.out.println("==================================");
int chessArray1[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
chessArray1[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
// 输出转换后的二维数组
for (int[] row : chessArray1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}