螺旋矩阵算法问题

Posted luffy5459

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了螺旋矩阵算法问题相关的知识,希望对你有一定的参考价值。

    螺旋矩阵算法问题,大致描述如下,给出一个n*n的矩阵,螺旋式打印,比如:
    [[ 1, 2, 3, 4],
     [ 5, 6, 7, 8],
     [ 9,10,11,12],
     [13,14,15,16]]

    打印结果应该是:1,2,3,4,8,12,16,15,14,13,12,9,5,6,7,11,10。

    如下图所示,依次获取4*4的矩阵数据:

    

    打印的轨迹类似螺旋,因此也叫螺旋矩阵。

    这个题目还有一个变种,就是生成一个矩阵,矩阵的数据按照螺旋式结构填充。4*4的矩阵就变为了:

    [[ 1, 2, 3, 4],
     [12,13,14, 5],
     [11,16,15, 6],
     [10, 9, 8, 7]]

    这个题目,结果很直观,解决思路就是需要判断各种临界条件,可以考虑按照四个方向:从左到右,从上到下,从右到左,从下到上的顺序遍历或者循环,然后将对应的数据获取或者填入对应的位置。

package com.xxx.huali.hualitest.algorithm;
import java.util.ArrayList;
import java.util.List;
public class SpiralMatrix {
	
	/**
	 * 螺旋式排列
	 * @param data
	 * @return
	 */
	public static List<Integer> spiralOrder(int[][] data){
		List<Integer> list = new ArrayList<Integer>();
		if(data==null)
			return null;
		int size = data.length;
		int beginX = 0,endX = size-1;
		int beginY = 0,endY = size-1;
		while(true) {
			for(int j=beginX;j<=endX;++j)list.add(data[beginX][j]);
			if(++beginY>endY)break;
			for(int i=beginY;i<=endY;++i)list.add(data[i][endX]);
			if(beginX>--endX)break;
			for(int j=endX;j>=beginX;--j)list.add(data[endY][j]);
			if(beginY>--endY)break;
			for(int i=endY;i>=beginY;--i)list.add(data[i][beginX]);
			if(++beginX>endX)break;
		}
		return list;
	}
	
	/**
	 * 构建螺旋式矩阵
	 * @param n
	 * @return
	 */
	public static int[][] getMatrix(int n){
		int [][] data = new int[n][n];
		if(n==0)return null;
		int beginX = 0,endX = n-1;
		int beginY = 0,endY = n-1;
		int num = 1;
		while(true) {
			for(int j=beginX;j<=endX;++j)data[beginX][j] = num++;
			if(++beginY>endY)break;
			for(int i=beginY;i<=endY;++i)data[i][endX] = num++;
			if(beginX>--endX)break;
			for(int j=endX;j>=beginX;--j)data[endY][j] = num++;
			if(beginY>--endY)break;
			for(int i=endY;i>=beginY;--i)data[i][beginX] = num++;
			if(++beginX>endX)break;
		}
		return data;
	}
	
	public static void main(String[] args) {
		int [][] data = new int[][] {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
		List<Integer> list = spiralOrder(data);
		for(Integer d:list) {
			System.out.print(d+" ");
		}
		System.out.println();
		System.out.println("======================================");
		int[][] data2 = getMatrix(4);
		for(int i=0;i<data2.length;i++) {
			for(int j=0;j<data2.length;j++) {
				System.out.print(data2[i][j]+"\\t");
			}
			System.out.println();
		}
	}
}

    运行程序,打印结果:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 
======================================
1	2	3	4	
12	13	14	5	
11	16	15	6	
10	9	8	7	

    算法时间复杂度都是O(n^2)。

以上是关于螺旋矩阵算法问题的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# leetcode算法题:螺旋矩阵

算法:螺旋矩阵

Java算法 每日一题 编号59:螺旋矩阵II

Java算法 每日一题 编号59:螺旋矩阵II

Java算法 每日一题 编号59:螺旋矩阵II

#yyds干货盘点# leetcode算法题:螺旋矩阵 II