02、数据结构与算法-数组与稀疏数组-笔记整理

背景

二维数组如果数据很少的情况下,有很多默认值为0的无意义的数据,因此可转为稀疏数组

转换思路

原数组示例:
*
转换后示例:
*
思路描述:

1、 稀疏数组列固定为3,其中第一行第一列代表原始数组一共有多少行,第一行第二列代表原始数组有多少列,第一行第三列代表原始数组一共有多少个值需要转化;
2、 稀疏数组从第二行开始,第一列代表原始数组第几行,第二列代表原始数组第几列,第三列代表具体的值;
3、 稀疏数组的行数为:原始数组有效值+1;

代码示例

   public class SparseArray {
   
     
    
    	public static void main(String[] args) {
   
     
    		//原始数组
    		int chessArr1[][] = new int[5][5];
    		chessArr1[1][2] = 11;
    		chessArr1[3][3] = 22;
    		//遍历多少个非0个数
    		int sum = 0;
    		for (int i = 0; i < 5; i++) {
   
     
    			for (int j = 0; j < 5; j++) {
   
     
    				if (chessArr1[i][j] != 0) {
   
     
    					sum++;
    				}
    			}
    		}
    		//稀疏数组
    		int sparseArr[][] = new int[sum + 1][3];
    		sparseArr[0][0] = 5;//原始数组有5行
    		sparseArr[0][1] = 5;//原始数组有5列
    		sparseArr[0][2] = sum;//原始数组有sum个有效值
    
    		// 遍历二维数组,将非0的值存放到 sparseArr中
    		int count = 0; //count 用于记录是第几个非0数据
    		for (int i = 0; i < 5; i++) {
   
     
    			for (int j = 0; j < 5; j++) {
   
     
    				if (chessArr1[i][j] != 0) {
   
     
    					count++;
    					sparseArr[count][0] = i;
    					sparseArr[count][1] = j;
    					sparseArr[count][2] = chessArr1[i][j];
    				}
    			}
    		}
    
    		//稀疏数组还原二维数组
    		int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    		for(int i = 1; i < sparseArr.length; i++) {
   
     
    			chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    		}
    		printArr(chessArr2);//打印还原后的数组
    	}
    
    	private static void printArr(int[][] chessArr1) {
   
     
    		for (int[] row : chessArr1) {
   
     
    			for (int data : row) {
   
     
    				System.out.printf("%d\t", data);
    			}
    			System.out.println();
    		}
    	}
    
    }

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: