零矩阵

零矩阵_第1张图片

暴力解法:先全部检索,定位0所在的位置, 记录到新的数组

                  数组的行列分别进行去重

                  数组中记录的行列赋值为零

如果直接修改,在行被修改之后,修改列时会因为行已经被修改产生影响

import org.junit.Test;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;

public class ZeroMatrix {
    @Test
    public void test1() {
        int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 0}, {7, 8, 9}};
        ZeroMatrix.solution(arr);
        for (int[] l : arr) {
            for (int r : l) {
                System.out.print(r + " ");
            }
            System.out.println();
        }
    }

    public static void solution(int[][] arr) {
        List listRow = new ArrayList<>();//记录存在零的行
        List listColumn = new ArrayList<>();//记录存在零的列
        //遍历,记录零位置的行与列
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if(arr[i][j] == 0){
                    listRow.add(i);
                    listColumn.add(j);
                }
            }
        }

        //去重
        LinkedHashSet hashSetRow = new LinkedHashSet<>(listRow);
        LinkedHashSet hashSetColumn = new LinkedHashSet<>(listColumn);

        int k = 0,l = 0;
        for (int i = 0; i < arr.length; i++) {
            if(hashSetRow.contains(i)){//此时的i为存在零的行
                while(k < arr[0].length){
                    arr[i][k++] = 0;//行赋值为零
                }

            }else {
                for (int j = 0; j < arr[0].length; j++) {
                    if (hashSetColumn.contains(j)){//此时的j为存在零的列
                        while(l < arr.length){
                            arr[l++][j] = 0;//列赋值为零
                        }
                    }
                }
            }
        }
    }
}

你可能感兴趣的:(矩阵,算法,线性代数)