【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;
    }
}
相关推荐
C^h2 小时前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
深藏功yu名2 小时前
Day25(高阶篇):RAG检索与重排序算法精研|从原理到参数调优,彻底攻克检索瓶颈
人工智能·算法·ai·自然语言处理·排序算法·agent
不吃香菜学java2 小时前
苍穹外卖-新增套餐
java·spring boot·spring·tomcat·maven·mybatis
wangchunting2 小时前
Spring Boot 概述
java·spring boot·后端
郝学胜-神的一滴2 小时前
深入解析:生成器在UserList中的应用与Python可迭代对象实现原理
开发语言·python·程序人生·算法
雪木木2 小时前
刷题:力扣热题100--滑动窗口(Day03)
算法·leetcode
为美好的生活献上中指2 小时前
*Java 沉淀重走长征路*之——《Linux 从入门到企业实战:一套六步法,带你打通运维与开发的任督二脉》
java·linux·运维·开发语言·阿里云·华为云·linux命令
Mr.wangh2 小时前
redis面试题总结
java·redis·面试
lcj25112 小时前
蓝桥杯C++:数据结构(功能导向速查)
数据结构·c++·蓝桥杯