leetcode-hot100-矩阵:73矩阵置零-54螺旋矩阵-48旋转图像-240搜索二维矩阵

73矩阵置零

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

我们可以用两个标记数组分别记录每一行和每一列是否有零出现。

具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;
        boolean[] row=new boolean[m];
        boolean[] col=new boolean[n];

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==0){
                    row[i]=col[j]=true;
                }
            }
        }

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(row[i] || col[j]){
                    matrix[i][j]=0;
                }
            }
        }

    }
}

54螺旋矩阵

题目:给你一个m行n列的矩阵matrix ,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

边界收缩:

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int top=0;
        int bottom=matrix.length-1;
        int left=0;
        int right=matrix[0].length-1;
        List<Integer> result=new ArrayList<>();

        while(top<=bottom && left<=right){
            for(int j=left;j<=right;j++){
                result.add(matrix[top][j]);
            }

            for(int i=top+1;i<=bottom;i++){
                result.add(matrix[i][right]);
            }

            if(top<bottom){
                for(int j=right-1;j>=left;j--){
                    result.add(matrix[bottom][j]);
                }
            }

            if(left<right){
                for(int i=bottom-1;i>top;i--){
                    result.add(matrix[i][left]);
                }
            }

            top++; bottom--; left++; right--;
        }
        return result;
    }
}

48旋转图像

题目:给定一个n × n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]],输出:[[7,4,1],[8,5,2],[9,6,3]]

顺时针旋转90后,位于 (i,j) 的元素去哪了。

竖着看:第一列的元素去到第一行。第二列的元素去到第二行。第 j 列的元素去到第 j 行。

横着看:第一行的元素去到最后一列。第二行的元素去到倒数第二列。第 i 行的元素去到第n−1−i 列。(i 从 0 开始)。所以位于 i 行 j 列的元素,去到 j 行 n−1−i 列,即 (i,j)→(j,n−1−i)。

(i,j)→(j,n−1−i) 可以通过两次翻转操作得到:先转置再行翻转。

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){   // 遍历对角线下方元素
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }

        for(int[] row:matrix){
            for(int j=0;j<n/2;j++){
                int temp=row[j];
                row[j]=row[n-1-j];
                row[n-1-j]=temp;
            }
        }
    }
}

240搜索二维矩阵

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

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i=0;
        int j=matrix[0].length-1;

        while(i<matrix.length && j>=0){
            if(matrix[i][j]==target){
                return true;
            }
            if(matrix[i][j]<target){
                i++;
            }else{
                j--;
            }
        }
        return false;
    }
}
相关推荐
Frostnova丶2 小时前
LeetCode 1622. 奇妙序列
算法·leetcode
计算机安禾2 小时前
【C语言程序设计】第26篇:变量的作用域与生命周期
c语言·开发语言·数据结构·算法·leetcode·visual studio code·visual studio
Rorsion2 小时前
对矩阵的理解
线性代数·矩阵
一叶落4383 小时前
LeetCode 380. O(1) 时间插入、删除和获取随机元素【哈希表 + 动态数组 | C语言详解】
c语言·数据结构·c++·算法·leetcode·散列表
Eward-an12 小时前
【算法竞赛/大厂面试】盛最多水容器的最大面积解析
python·算法·leetcode·面试·职场和发展
阿豪学编程12 小时前
LeetCode438: 字符串中所有字母异位词
算法·leetcode
Trouvaille ~12 小时前
【递归、搜索与回溯】专题(七):FloodFill 算法——勇往直前的洪水灌溉
c++·算法·leetcode·青少年编程·面试·蓝桥杯·递归搜索回溯
Storynone13 小时前
【Day23】LeetCode:455. 分发饼干,376. 摆动序列,53. 最大子序和
python·算法·leetcode
We་ct16 小时前
LeetCode 79. 单词搜索:DFS回溯解法详解
前端·算法·leetcode·typescript·深度优先·个人开发·回溯