【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像

73-矩阵置零

给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法

复制代码
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
复制代码
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

**思路:**先遍历查哪个是0,标记对应的行和列,重新遍历 若行列有一个符合,则将其置为0

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m=matrix.length,n=matrix[0].length;
        boolean [] l=new boolean [m];
        boolean[] w=new boolean [n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==0){l[i]=true;w[j]=true;}
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(l[i]||w[j]){matrix[i][j]=0;}
            }
        }
    }
}

**细节注意:**n=matrix[0].length 列的取长要[ 0 ] ,不能为空。

行列标记用布尔最方便


54-螺旋矩阵(贪吃蛇)

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

复制代码
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路:移动过程中会碰到边界或遇到已读,然后需要判断方向且变换方向。方向使用预留的四种,通过索引方式来回试 合适就走,使用已读visited矩阵标记已读。索引分四个方向,m和n放在一起,使用模4进行更新。

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List <Integer> ans=new ArrayList<Integer>();//设置动态数组存结果
        
        int M=matrix.length;
        int N=matrix[0].length;
        boolean [][] visited=new boolean [M][N];//设置已读
        int [][] dir={{0,1},{1,0},{0,-1},{-1,0}};//四个方向:右下左上
        int m=0,n=0; //初始化第一个位置
        int index=0; //控制方向的索引
        for(int i=0;i<M*N;i++){
            ans.add(matrix[m][n]);//存当前值
            visited[m][n]=true;//将改值改为已读
            int nextm=m+dir[index][0];//查下一个是谁,不赋值给mn,纯试探来求index
            int nextn=n+dir[index][1];
            //判断下一个是否越界,求索引
            //不越界索引不变,越界则换方向,模4代表四个来回试
            if(nextm<0||nextm>=M||nextn<0||nextn>=N||visited[nextm][nextn]){
                index=(index+1)%4;
            }
            //执行新方向 
            m+=dir[index][0];
            n+=dir[index][1];
        }
        return ans;
        
    }
}

48-旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

复制代码
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
复制代码
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

**思路:**简单,矩阵从[ i ][ j ] 变成 [ j ][ m-i-1 ],再换回来原矩阵

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;
        int [][] matrix2=new int [m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                matrix2[j][m-i-1]=matrix[i][j];
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                matrix[i][j]=matrix2[i][j];
            }
        }
    }
}

编写一个高效的算法来搜索 m xn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。

复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

**思路:**暴力解法,能解出来就行,我管你这呢那呢。

有序可以使用二分查找

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m=matrix.length;
        int n=matrix[0].length;
        boolean ans=false;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==target){
                    ans=true;}
            }
        }
        return ans;
    }
}
相关推荐
t***54416 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
_深海凉_16 小时前
LeetCode热题100-最小栈
java·数据结构·leetcode
不知名的忻17 小时前
Morris遍历(力扣第99题)
java·算法·leetcode·morris遍历
daidaidaiyu17 小时前
一文学习入门 ThingsBoard 开源物联网平台
java·mqtt·spring
状元岐17 小时前
C#反射从入门到精通
java·javascript·算法
亚历克斯神17 小时前
Elasticsearch 全文搜索实战:构建企业级搜索引擎
java·spring·微服务
亚历克斯神17 小时前
Spring Boot 与 Elasticsearch 8.0 集成
java·spring·微服务
_深海凉_17 小时前
LeetCode热题100-除了自身以外数组的乘积
数据结构·算法·leetcode
Kk.080218 小时前
项目《基于Linux下的mybash命令解释器》(一)
前端·javascript·算法
星晨雪海18 小时前
Lombok 注解使用场景终极总结
java·数据库·mysql