写二维稀疏数组的思路

思路:

创建一个可以保存非零值的数组:在第几行有,在第几列有,有哪些数字

第一行用来写,一共几行,一共几列,一共存几个数字

大致格式:

11(行)11(列)3(值)
555
562
570

1. 创建一个数组

  • 写:一共几行几列
  • 写:有哪些是不一样的值,比如非零
int[][] array1 = new int [11][11];
//11行,11列
array1[5][5]=5;
array1[5][6]=2;
array1[5][7]=0;
//列出来:第几行第几列是非0值,值是多少

2. 保存非零个数

  • 用一个 int 类型来保存一个数字(保存共几个非零值)

:用for循环把数组里面的数字都走一遍,遇到非零就记录下来

int sum = 0;  //之后要用,定义在循环外
for(int i = 0;i < 11;i++){
    for(int j = 0;j < 11;j++){
        if(array1[i][j]!=0){
            sum++;
        }
    }
}

3. 创建一个稀疏数组的框架

  • 第一行写:一共几行,一共几列,一共几个值

  • 第二行开始记录:第几行,第几列,有值

故:稀疏数组应该(非零个数+1)个行,(3)个列

像开头表格一样

int[][] array2 = new int[sum+1][3];
//创建稀疏数组大框架
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//赋值稀疏数组的第一行
//没赋值的默认为0,之后马上赋值

4. 将非零的值赋值到稀疏数组框架里

  • 用循环,把数组里面的数组全走一遍,遇到非零的就记录到稀疏数组里。也就是array2[ ] [ ]

  • 用一个 int 类型来定位把数字记录到稀疏数组的第几行。

    第1行在创建稀疏数组的时候已经赋值过了。

    第一个非零,第2行

    第二个非零,第3行

int count = 0;
for(int i = 0;i < array1.length;i++){
    for(int j = 0;j < array1[i].length;j++){
        //每一行数组中有几个元素:array1[i].length
        if(array1[i][j]!=0){
            count++;
            array2[count][0] = i;
            array2[count][1] = j;
            array2[count][2] = array1[i][j];
            //用count一行一行地赋值到稀疏数组array2里
        }
    }
}

5. 输出(打印)稀疏数组

  • 用for循环输出
for(int i = 0;i < array2.length;i++){
    System.out.println(array2[i][0]+"\t"
                      +array2[i][1]+"\t"
                      +array2[i][2]+"\t")
}

6. 还原稀疏数组

  • 利用稀疏数组第一行,还原数组的大框架
int[][] array3 = new int[array2[0][0]][array2[0][1]];
  • 给元素还原:第几行,第几列,什么值,在稀疏数组的每一行都能找到
for(int i = 1;i < array2.length;i++){
    //从稀疏数组的第二行开始是值,也就是从1开始
    array3[array[i][0]][array[i][1]]=array2[i][2];
}
  • 把还原的数组,打印出来(单纯的打印用增强型for循环)
for(int[] ints : array3){
    for(int[] anInt : ints){
        System.out.print("anInt+"\t");
    }
    System.out.println(); //换行
}

思路步骤总结:

  1. 创建一个稀疏数组

  2. 保存非零的个数

  3. 创建一个稀疏数组框架

  4. 将非零的值,赋值到稀疏数组框架里

    (用count,从稀疏数组第二行开始赋值)

  5. 输出(打印)稀疏数组

  6. 还原稀疏数组

    (用稀疏数组第一行,还原大框架)

    (利用稀疏数组的每一行数字,赋值)

    (打印数组)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值