给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat及其阶数n,若方阵中某个元素为0,则将其所在的行与列清零。返回改变后的int[][]方阵(C++中为vector<vector><int>>),保证n小于等于300,矩阵中的元素在nt范围内。</int></vector></int></vector>
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat及其阶数n,若方阵中某个元素为0,则将其所在的行与列清零。返回改变后的int[][]方阵(C++中为vector<vector><int>>),保证n小于等于300,矩阵中的元素在nt范围内。</int></vector></int></vector>
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
public class Clearer {
public int[][] clearZero(int[][] mat, int n) {
// write code here
if (mat == null) {
return mat;
}
int row_num = mat.length;
int column_num = mat[0].length;
boolean[] row_flag = new boolean[row_num];
boolean[] column_flag = new boolean[column_num];
for (int i = 0; i < row_num; i++) {
for (int j = 0; j < column_num; j++) {
if (mat[i][j] == 0) {
row_flag[i] = true;
column_flag[j] = true;
}
}
}
for (int i = 0; i < row_num; i++) {
for (int j = 0; j < column_num; j++) {
if(row_flag[i] || column_flag[j]) {
mat[i][j] = 0;
}
}
}
return mat;
}
} //自己想到的方法,跟大神的不谋而合,两个整形数组改成boolea数组为占用更小空间,懒得改了
public int[][] clearZero(int[][] mat, int n) {
if(mat==null||n<=0) return mat;
int[] column=new int[n];
int[] row=new int[n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mat[i][j]==0){
row[i]=1;
column[j]=1;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)if(row[i]==1||column[j]==1) mat[i][j]=0;
}
return mat;
}
import java.util.*;
public class Clearer {
public int[][] clearZero(int[][] mat, int n) {
int [][] res = mat;
ArrayList<Integer> i_list = new ArrayList<>();
ArrayList<Integer> j_list = new ArrayList<>();
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (mat[i][j] == 0) {
i_list.add(i);
j_list.add(j);
}
}
}
for (int l = 0; l < i_list.size(); l ++) {
for (int k = 0; k < n;k ++) {
res[k][j_list.get(l)] = 0;
res[i_list.get(l)][k] = 0;
}
}
return res;
}
}
}
import java.util.*;
public class Clearer {
public int[][] clearZero(int[][] mat, int n) {
// write code here
HashSet<Integer> rowSet = new HashSet<Integer>();
HashSet<Integer> colSet = new HashSet<Integer>();
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (mat[i][j] == 0) {
rowSet.add(i);
colSet.add(j);
}
}
}
Iterator<Integer> rowIterator = rowSet.iterator();
while (rowIterator.hasNext()) {
int zeroRow = rowIterator.next();
for (int j = 0; j < n; j ++) {
mat[zeroRow][j] = 0;
}
}
Iterator<Integer> colIterator = colSet.iterator();
while (colIterator.hasNext()) {
int zeroCol = colIterator.next();
for (int i = 0; i < n; i ++) {
mat[i][zeroCol] = 0;
}
}
return mat;
}
}
}
import java.util.*;
public class Clearer {
public int[][] clearZero(int[][] mat, int n) {
// write code here
HashMap<Integer,Integer> row=new HashMap<Integer,Integer>();
HashMap<Integer,Integer> clo=new HashMap<Integer,Integer>();
ArrayList<Integer> ro=new ArrayList<Integer>();
ArrayList<Integer> cl=new ArrayList<Integer>();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mat[i][j]==0)
{
if(!row.containsKey(i))
{
row.put(i,i);
ro.add(i);
}
if(!clo.containsKey(j))
{
clo.put(j,j);
cl.add(j);
}
}
}
}
if(ro.size()!=0)
{
int num=0;
while(num<ro.size())
{
for(int i=0;i<n;i++)
{
mat[ro.get(num)][i]=0;
}
num++;
}
}
if(cl.size()!=0)
{
int num=0;
while(num<cl.size())
{
for(int i=0;i<n;i++)
{
mat[i][cl.get(num)]=0;
}
num++;
}
}
return mat;
}
}
import java.util.*;
public class Clearer {
public int[][] clearZero(int[][] mat, int n) {
// write code here
HashSet<Integer> xHash = new HashSet<>();
HashSet<Integer> yHash = new HashSet<>();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mat[i][j] == 0){
xHash.add(i);
yHash.add(j);
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(xHash.contains(i) || yHash.contains(j))
mat[i][j] = 0;
}
}
return mat;
}
}
//楼上的Java版本有点复杂,写了个简单点的。 publicclassClearer { publicint[][] clearZero(int[][] mat, intn) { // write code here boolean[] rowArray = newboolean[n]; boolean[] columnArray = newboolean[n]; //记录为0的位置,把相应的行列位置设为true for(inti=0; i<n;i++) { for(intj=0;j<n;j++) { if(mat[i][j]==0) { rowArray[i]=true; columnArray[j]=true; } } } //遍历找到之前记录的位置,把相应行列赋值为0 for(inti=0;i<n;i++) { for(intj=0;j<n;j++) { if(rowArray[i]||columnArray[j]) { mat[i][j] = 0; } } } returnmat; } }