算法笔记:Day-06(矩阵的顺时针遍历,特定顺序遍历,二维数组的变换)

特定顺序遍历二维数组

54. 螺旋矩阵

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix.length==0)
        return new ArrayList<>();
        int l=0;r=matrix[0].length-1,t=0,b=matrix.length-1;
        Integer[] res=new Integer[(r+1)*(b+1)];
        while(true){
            for(int i=l;i<=r;i++) res[x++]=matrix[t][i];//由左到右
            if(++t>b) break;  //第一行遍历完了,所以t上边界要下移
            for(int i=t;i<=b;i++) res[x++]=matrix[i][r];//由上到下
            if(--r<l) break;
            for(int i=r;i>=l;i--) res[x++]=matrix[b][i];//由右到左
            if(--b<t) break;
            for(int i=b;b>=t;i--) res[x++]=matrix[i][l];//由下到上
            if(++l>r) break;
        }
        retuen Arrays.asList(res);
    }
}

这道题我参考了作者:Krahets 本题链接链接
我认为这世道很好的题,之后的矩阵只要涉及了顺时针遍历就可以套用这个模板,就算是其他特定顺序也可以参考这个。

59. 螺旋矩阵 II

java 复制代码
class Solution {
    public int[][] generateMatrix(int n) {
        int l=0,r=n-1,t=0,b=n-1,x=1;
        int[][] res=new int[n][n];
        while(true){
            for(int i=l;i<=r;i++) {res[t][i]=x++;}
            if(++t>b) break;
            for(int i=t;i<=b;i++) {res[i][r]=x++;}
            if(--r<l) break;
            for(int i=r;i>=l;i--) {res[b][i]=x++;}
            if(--b<t) break;
            for(int i=b;i>=t;i--) {res[i][l]=x++;}
            if(++l>r) break;
        }
        return res;
    }
}

这道题就可以现学现用了,直接顺时针遍历,所有遍历到的元素加1就好了。

498. 对角线遍历

java 复制代码
class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        int[] res = new int[m * n];
        int pos = 0;
        for (int i = 0; i < m + n - 1; i++) {
            if (i % 2 == 1) {
                int x = i < n ? 0 : i - n + 1;
                int y = i < n ? i : n - 1;
                while (x < m && y >= 0) {
                    res[pos] = mat[x][y];
                    pos++;
                    x++;
                    y--;
                }
            } else {
                int x = i < m ? i : m - 1;
                int y = i < m ? 0 : i - m + 1;
                while (x >= 0 && y < n) {
                    res[pos] = mat[x][y];
                    pos++;
                    x--;
                    y++;
                }
            }
        }
        return res;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/diagonal-traverse/solutions/1597961/dui-jiao-xian-bian-li-by-leetcode-soluti-plz7/

这道题直接拿官方的了。用了模拟的方法,模拟了每个对角线。

二维数组变换

566. 重塑矩阵

java 复制代码
class Solution {
    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int m=mat.length,n=mat[0].length;
        if(m*n!=r*c)
        return mat;
        int[][] ans=new int[r][c];
        for(int i=0;i<m*n;i++){
            ans[i/c][i%c]=mat[i/n][i%n];
        }
        return ans;
    }
}

这道题依旧参考官方,因为以我的智商只会暴力求解了。
ans[i/c][i%c]=mat[i/n][i%n];这一步很精髓。

我的理解是for(int i=0;i<m*n;i++)这一步意为,把原数组抽象成一维数组,遍历原数组每一个元素。最后映射到二维数组中。

48. 旋转图像

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

这题的话还算简单,但有个关于数组的知识点:
我一开始是使用matrix=ans给matrix赋值的,但一直赋值上去???

传参实际上是传递的是引用的副本不是引用本身

这里要明白matrix=ans是指改变matrix副本引用 ,所以没有改变实际matrix的值。

而循环可以给matrix赋值的原因是,matrix副本 仍然是指向实际matrix的。

所以你改变了副本的引用原来的数组不变,而你直接更改副本原来的值就变了。

相关推荐
十年一梦实验室23 分钟前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
15年网络推广青哥23 分钟前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵
AI莫大猫23 分钟前
(6)YOLOv4算法基本原理以及和YOLOv3 的差异
算法·yolo
阿正的梦工坊24 分钟前
范德蒙矩阵(Vandermonde 矩阵)简介:意义、用途及编程应用
线性代数·矩阵
taoyong00126 分钟前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
Uu_05kkq35 分钟前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
清梦20202 小时前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar2 小时前
速通Python 第四节——函数
开发语言·python·算法
Altair澳汰尔2 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
A懿轩A3 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列