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;
    }
}
相关推荐
MediaTea2 小时前
AI 术语通俗词典:矩阵乘法
人工智能·线性代数·矩阵
倦王2 小时前
力扣日刷47-补
python·算法·leetcode
无限进步_4 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio
凌波粒4 小时前
LeetCode--344.反转字符串(字符串/双指针法)
算法·leetcode·职场和发展
啊哦呃咦唔鱼4 小时前
LeetCode hot100-543 二叉树的直径
算法·leetcode·职场和发展
样例过了就是过了5 小时前
LeetCode热题100 爬楼梯
c++·算法·leetcode·动态规划
ThisIsMirror6 小时前
leetcode 452 Arrays.sort()排序整数溢出、Integer.compare(a[1], b[1])成功的问题
算法·leetcode
x_xbx7 小时前
LeetCode:438. 找到字符串中所有字母异位词
算法·leetcode·职场和发展
派大星~课堂7 小时前
【力扣-94.二叉树的中序遍历】Python笔记
笔记·python·leetcode
AI成长日志8 小时前
【笔面试算法学习专栏】堆与优先队列实战:力扣hot100之215.数组中的第K个最大元素、347.前K个高频元素
学习·算法·leetcode