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;
    }
}
相关推荐
圣保罗的大教堂4 小时前
leetcode 1855. 下标对中的最大距离 中等
leetcode
脱氧核糖核酸__8 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
生信研究猿8 小时前
leetcode 416. 分割等和子集
算法·leetcode·职场和发展
6Hzlia9 小时前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表
踩坑记录12 小时前
leetcode 92. 反转链表 II 区间反转(不是整条链表反转)
leetcode·链表
6Hzlia13 小时前
【Hot 100 刷题计划】 LeetCode 148. 排序链表 | C++ 归并排序自顶向下
c++·leetcode·链表
im_AMBER13 小时前
Leetcode 162 除了自身以外数组的乘积 | 接雨水
开发语言·javascript·数据结构·算法·leetcode
啊哦呃咦唔鱼13 小时前
leetcodehot100-347. 前 K 个高频元素
数据结构·算法·leetcode
玛丽莲茼蒿13 小时前
Leetcode hot100 多数元素【简单】
算法·leetcode·职场和发展
AbandonForce13 小时前
Map类:pair键值对|map的基本操作|operator[]
开发语言·c++·算法·leetcode