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

题目

输入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 2019-07-19 00:05  coding_gaga  阅读(297)  评论(0编辑  收藏  举报

导航