[算法题解]矩阵元素按从小到大,逆时针排列在新矩阵中

题目

输入N*N矩阵,输出逆时针排序后的矩阵。

题解

在一维临时数组排序,然后控制矩阵左上角和右下角,一圈圈写入新的矩阵。

代码


import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int N=in.nextInt();
		int[][] m=new int[N][N];
		for(int i=0;i<N;++i) {
			for(int j=0;j<N;++j) {
				m[i][j]=in.nextInt();
			}
		}
		int[][] sortM=new int[N][N];
		sortM=dealMatrix(m);
		for(int i=0;i<N;++i) {
			for(int j=0;j<N;++j) {
				System.out.print(sortM[i][j]);
			}
			System.out.println("\n");
		}
	}
	
	public static int[][] dealMatrix(int[][] m){
		if(m==null||m.length!=m[0].length) {
			return null;
		}
		
		int N=m.length;
		int[] sortArr=new int[N*N];
		int pos=0;
		for(int i=0;i<N;++i) {
			for(int j=0;j<N;++j) {
				sortArr[pos++]=m[i][j];
			}
		}
		
		Arrays.sort(sortArr);
		
		int lRow=0;
		int lCol=0;
		int rRow=N-1;
		int rCol=N-1;
		int[][] sortM=new int[N][N];
		int arrPos=0;
		while(lRow<=rRow&&lCol<=rCol) {//
			arrPos=writeSortM(sortM,lRow++,lCol++,rRow--,rCol--,sortArr,arrPos);
		}
		return sortM;
	}
	
	private static int writeSortM(int[][] sortM,int lRow,int lCol,int rRow,int rCol,int[] sortArr,int arrPos) {
		if(lRow==rRow&&lCol==rCol) {
			sortM[lRow][lCol]=sortArr[arrPos++];
			return arrPos;
		}
		
		int i=lRow;//
		int j=lCol;//
		while(i<rRow) {//
			sortM[i++][j]=sortArr[arrPos++];
		}
		while(j<rCol) {
			sortM[i][j++]=sortArr[arrPos++];
					
		}
		while(i>lRow) {
			sortM[i--][j]=sortArr[arrPos++];
		}
		while(j>lCol){
			sortM[i][j--]=sortArr[arrPos++];
		}
		return arrPos;
	}
	
}

posted on   coding_gaga  阅读(301)  评论(0编辑  收藏  举报

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示