博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
若一个M*N的举证当中某个元素为零,则将其所有的行和列清零。
阅读量:6280 次
发布时间:2019-06-22

本文共 2841 字,大约阅读时间需要 9 分钟。

这是一道程序员面试金典上面的练习题;读完题其实结题思路很明显了;

输入矩阵—>搜索出为零的部位—>利用为零的部位信息重新遍历矩阵给该赋值0的位点给0—>结束

package shounue;import java.util.Scanner;public class SetMatrixZeroes {public static void setZeros(int[][] matrix){    boolean [] row = new boolean[matrix.length];    boolean [] column = new boolean[matrix[0].length];    for(int i = 0; i < matrix.length; i++)        for(int j = 0; j < matrix[0].length; j++)        {            if(matrix[i][j] == 0)             {                row[i] = true;                column[j] = true;            }        }    for(int i = 0; i < matrix.length; i++)        for(int j = 0; j < matrix[0].length;j++)        {            if(row[i]||column[j])                matrix[i][j] = 0;        }}    public static void main(String [] args){    Scanner in = new Scanner(System.in);    System.out.println("please input row and column");    int row = in.nextInt();    int column = in.nextInt();    int [][] Arrays = new int[row][column];    for(int i = 0; i < Arrays.length; i++)       for(int j = 0; j < Arrays[0].length;j++)             Arrays[i][j] = in.nextInt();        setZeros(Arrays);    for(int i = 0; i < Arrays.length; i++)    { for(int j = 0; j < Arrays[0].length;j++)              { System.out.print(Arrays[i][j]);                System.out.print(" ");              }      System.out.println();    }}}

可以看到,常规解法时间复杂度还是蛮大的需要两次O(N*M)的统计过程;

回想到Leetcode 有相同的题目:73. Set Matrix Zeroes 

解法如下:

public class Solution {    public void setZeroes(int[][] matrix) {        if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return; //好的算法,都会事先对不可能的情况进行处理;数组处理NULL 和值        int m = matrix.length;        int n = matrix[0].length;        boolean row = false;        boolean col = false;        for(int i = 0; i < m; i++)          {              for(int j = 0; j < n; j++)                {                    if(matrix[i][j]==0)                      {                         matrix[0][j] = 0;                         matrix[i][0] = 0;                         if(i==0) row = true;                         if(j==0) col = true;                     }                }          }         for(int i = 1; i < m; i++)         {             if(matrix[i][0] == 0) {                 for(int j = 1; j < n; j++)  matrix[i][j] = 0;             }         }         for(int j = 1; j < n; j++)         {             if(matrix[0][j] == 0){                 for(int i = 1; i < m; i++) matrix[i][j] = 0;             }         }         if (row){             for(int j = 0; j < n; j++) matrix[0][j] = 0;         }         if(col){             for(int i = 0; i < m; i++) matrix[i][0] = 0;         }    }}

解题思路:

(1)将矩阵中有0的情况,推到矩阵的边缘上面来(也就是第一行,第一列);同时用两个寄存器记录下第一行和第一列是否为0的情况。整个过程十分类似经典手机游戏2048!

(2)利用第一行和第一列的情况给对应的行和列赋值0;

(3)最后利用两个寄存器的值重新判断第一行和第一列的赋值0情况;

相比第一种方案,有点在于减少了使用的寄存器,同时减少了不必要的重新赋值过程!!!!

转载于:https://www.cnblogs.com/ProWhalen/p/5362382.html

你可能感兴趣的文章
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>