2024.4.29
题目来源
我的题解
方法一 模拟
先以第一行的每个元素作为对角线的开始,然后再以第一列的每个元素作为对角线的开始。并在遍历过程中记录(数组或者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;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~