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

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

相关推荐
计算机毕业设计开发1 分钟前
django高校公寓管理系统--附源码64226
java·c++·spring boot·python·spring cloud·django·php
one____dream1 分钟前
【算法】移除链表元素与反转链表
数据结构·python·算法·链表
memmolo2 分钟前
【3D测量中的术语:系统误差、随机误差、精密度、准确度】
算法·计算机视觉·3d
睡不醒的kun3 分钟前
不定长滑动窗口-基础篇(2)
数据结构·c++·算法·leetcode·哈希算法·散列表·滑动窗口
霑潇雨4 分钟前
题解 | 分析每个商品在不同时间段的销售情况
数据库·sql·算法·笔试
金枪不摆鳍4 分钟前
算法-动态规划
算法·动态规划
季明洵5 分钟前
Java中哈希
java·算法·哈希
组合缺一5 分钟前
Claude Code Agent Skills vs. Solon AI Skills:从工具增强到框架规范的深度对齐
java·人工智能·python·开源·solon·skills
学海无涯书山有路7 分钟前
Android ViewBinding 新手详解(Java 版)—— 结合 ViewModel+LiveData 实战
android·java·开发语言
jaysee-sjc7 分钟前
【练习十】Java 面向对象实战:智能家居控制系统
java·开发语言·算法·智能家居