Problem: 1329. 将矩阵按对角线排序
思路
- 循环每条对角线
- 对每个对角线的数据进行排序
解题方法
- 找到每条对焦的起始坐标
- 边界判断找出每条对角线的坐标个数
- 使用冒泡排序对对角线数据排序
复杂度
时间复杂度:
循环每条对角线 O ( n ) O(n) O(n) * 使用冒泡排序 O ( n ) 2 O(n)^2 O(n)2 = O ( n ) 3 O(n)^3 O(n)3
空间复杂度:
原数组操作 O ( 1 ) O(1) O(1)
Code
class Solution {
/**
* 输入:[
* [3,3,1,1],
* [2,2,1,2],
* [1,1,1,2]
* ]
* 输出:[
* [1,1,1,1],
* [1,2,2,2],
* [1,2,3,3]
* ]
* @param mat
* @return
*/
public int[][] diagonalSort(int[][] mat) {
int xL = mat[0].length;
int yL = mat.length;
// x坐标++
for(int x = 0; x < xL; x ++) {
sort(mat, 0, x, Math.min(yL, xL - x) - 1);
}
// y坐标++
for(int y = 1; y < yL; y ++) {
sort(mat, y, 0, Math.min(yL - y, xL) - 1);
}
return mat;
}
/**
* 使用冒泡排序
* @param mat 原数组
* @param x 本次排序的x坐标
* @param y 本次排序的y坐标
* @param length 长度
*/
public void sort(int[][] mat, int x, int y, int length) {
int temp;
// 使用冒泡排序
for(int i = 0; i < length; i ++) {
for(int j = x , k = y;j < length - i || k < length - i; j ++, k ++) {
if(mat[j][k] > mat[j + 1][k + 1]) {
temp = mat[j][k];
mat[j][k] = mat[j + 1][k + 1];
mat[j + 1][k + 1] = temp;
}
}
}
}
}