螺旋矩阵算法解析(螺旋遍历)

题目:给定一个包含 m x n 个要素的矩阵,(m 行, n 列),写一个函数按照螺旋顺序,返回该矩阵中的所有要素。

格式:

输入依次输入两个整数 m 和 n,和一个 m x n 的整数数组,最后输出按照螺旋顺序返回的矩阵数组的元素。

样例输入

m = 3
n = 3
[
[ 1,2,3 ],
[ 4,5,6 ],
[ 7,8,9 ]
]

样例输出

[ 1,2,3,6,9,8,7,4,5 ]

先说一下思路:首先定义5个变量xbegin表示第一行的横坐标,xend是是最后一行的横坐标,ybegin表示的是第一列的纵坐标,yend表示的是最后一列的纵坐标,k用来计算已经输出的值的个数避免出现多输出或少输出的情况。然后可以把xbegin,ybegin,xend,yend看成是循环时的边界;当第一次循环输出第一行的数时边界为ybegin和yend当时j的范围是从ybegin到yend,然后输出时第一行不变的是xbegin变的是j也就是"a[xbegin][j]",当第一行输出完毕后需要把边界xbegin增加到1(减小边界范围)也就是源码里的"xbegin++"。第2次第3次循环······做的是同样的工作先看在哪个边界范围内,在范围内把数输出完毕后再把边界缩小以达到下次循环的需求。不要忘记在每次循环完毕后把k的值判断一下避免出现漏输出或多输出的情况。

代码如下:

package wwl.bluealgorithm;

import java.util.Scanner;
/**
 * 螺旋矩阵
 *
 */
public class Test01 {
	public static void main(String[] args) {
		Scanner s =new Scanner (System.in);
		int m =s.nextInt();
		int n=s.nextInt();
		int a[][] =new int [m][n];
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				a[i][j]=s.nextInt();
			}
		}
		//定义变量
		int xbegin = 0;
		int xend = m-1;
		int k = 0;
		int ybegin = 0;
		int yend = n-1;
		while(true) {
			//从左上到右上
			for (int j = ybegin; j <= yend; j++) {
				System.out.print(a[xbegin][j] + " ");
				k+=1;
			}
			xbegin++;
			if (k == m*n) {
				return;
			}
			//从右上到右下
			for (int i = xbegin; i <= xend; i++) {
				System.out.print(a[i][yend] + " ");
				k+=1;
			}
			yend--;
			if (k == m*n) {
				return;
			}
			//从右下到左下
			for (int j = yend; j >= ybegin; j--) {
				System.out.print(a[xend][j] + " ");
				k+=1;
			}
			xend--;
			if (k == m*n) {
				return;
			}
			//从左下到左上
			for (int i = xend; i >= xbegin; i--) {
				System.out.print(a[i][ybegin] + " ");
				k+=1;
			}
			ybegin++;
			if (k == m*n) {
				return;
			}
		}
			
	}

}

运行结果部分截图:
螺旋矩阵算法解析(螺旋遍历)_第1张图片
如各位大佬有更好的改进或建议请在评论区留言感谢!!

你可能感兴趣的:(算法)