赞
踩
不积跬步,无以至千里
给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。
输入:[[3,3,1,1],[2,2,1,2],[1,1,1,2]]
输出:[[1,1,1,1],[1,2,2,2],[1,2,3,3]]
根据矩阵的特点,我们可以将其以大对角线划分为两部分,再分别遍历这两部分进行冒泡排序。
看图:
矩阵按大对角线划分成上下两部分
然后分别遍历上下两部分,对每一条对角线上的元素进行冒泡排序
public class Main { public static int[][] diagonalSort(int[][] mat) { int rows=mat.length; int columns=mat[0].length; //先排有上半部分,从(0,0)开始 for (int i = 0; i < columns; i++) { toSort(0,i,rows,columns,mat); } //排左下半部分,(0,0)已经排过了,所以从(1,0)开始 for (int i = 1; i < rows; i++) { toSort(i,0,rows,columns,mat); } return mat; } //冒泡排序 //对角线上的元素坐标都是:[i+1][j+1]式递进 private static int[][] toSort(int i,int j, int rows, int columns, int[][] mat) { for (; i< rows-1 && j<columns-1; i++,j++) { for (int k = i+1,m=j+1; k < rows && m<columns; k++,m++) { if (mat[k][m]<mat[i][j]){ //交换 int temp=mat[k][m]; mat[k][m]=mat[i][j]; mat[i][j]=temp; } } } return mat; } }
学到了,学到了!
(这是刷题途中学到的思路,加以整理方便复习,希望本菜鸟可早日从"暴力"选手转型,冲冲冲!)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。