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;
}

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

相关推荐
JavaGuide4 分钟前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家27 分钟前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺30 分钟前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
SuperEugene32 分钟前
接口类型管理:从 any 到有组织的 api.d.ts
前端·面试·typescript
用户9083246027337 分钟前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
牛奶1 小时前
ts随笔:基础与类型系统
前端·面试·typescript
用户73992986959721 小时前
DeepSeek/GPT-4 落地实战:我如何用 Node.js + AI 手搓一个“面试神器”
面试
牛奶1 小时前
JS随笔:浏览器 API(DOM 与 BOM)
前端·javascript·面试
桦说编程1 小时前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
牛奶1 小时前
JS随笔:异步编程与事件循环
前端·javascript·面试