2024.4.29力扣每日一题——将矩阵按对角线排序

2024.4.29

题目来源

力扣每日一题;题序:1329

我的题解

方法一 模拟

先以第一行的每个元素作为对角线的开始,然后再以第一列的每个元素作为对角线的开始。并在遍历过程中记录(数组或者list)每个对角线上的所有元素,然后进行排序,排序后在进行一次遍历,将值塞入原始矩阵中。
时间复杂度 :O(mnlogmn)
空间复杂度:O(mn)

java 复制代码
public int[][] diagonalSort(int[][] mat) {
    int n=mat.length;
    int m=mat[0].length;
    //第一行
    for(int i=m-1;i>=0;i--){
        List<Integer> l=new ArrayList<>();
        l.add(mat[0][i]);
        int x=1,y=i+1;
        while(isValid(n,m,x,y)){
            l.add(mat[x][y]);
            x++;
            y++;
        }
        x=1;
        y=i+1;
        int index=0;
        l.sort((a,b)->a-b);
        mat[0][i]=l.get(index++);
        while(isValid(n,m,x,y)){
            mat[x][y]=l.get(index++);
            x++;
            y++;
        }
    }
    //第一列
    for(int i=1;i<n;i++){
        List<Integer> l=new ArrayList<>();
        l.add(mat[i][0]);
        int x=i+1,y=1;
        while(isValid(n,m,x,y)){
            l.add(mat[x][y]);
            x++;
            y++;
        }
        x=i+1;
        y=1;
        int index=0;
        l.sort((a,b)->a-b);
        mat[i][0]=l.get(index++);
        while(isValid(n,m,x,y)){
            mat[x][y]=l.get(index++);
            x++;
            y++;
        }
    }
    return mat;
}

public boolean isValid(int n,int m,int x,int y){
    return x>=0&&x<n&&y>=0&&y<m;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
tankeven15 分钟前
HJ92 在字符串中找出连续最长的数字串
c++·算法
逆境不可逃24 分钟前
【从零入门23种设计模式03】创建型之建造者模式(简易版与导演版)
java·后端·学习·设计模式·职场和发展·建造者模式
小雨中_26 分钟前
3.1 RLHF:基于人类反馈的强化学习
人工智能·python·深度学习·算法·动态规划
relis33 分钟前
从 dma-buf 到 tensor parallel:跨越领域的零拷贝模式
算法
一条大祥脚1 小时前
Manacher/马拉车算法
算法
小李独爱秋1 小时前
模拟面试:不能关机的情况下 , 如果挂载目录卸载不掉应该怎么办?
linux·运维·面试·职场和发展·操作系统·文件系统
phoenix@Capricornus1 小时前
初等数学中点到直线的距离
人工智能·算法·机器学习
汤姆yu1 小时前
基于springboot的健身爱好者打卡与互动交流系统
java·spring boot·后端
田里的水稻1 小时前
FA_规划和控制(PC)-快速探索随机树(RRT)
人工智能·算法·数学建模·机器人·自动驾驶
jaysee-sjc1 小时前
十三、Java入门进阶:异常、泛型、集合与 Stream 流
java·开发语言·算法