算法题:螺旋矩阵

 算法题:螺旋矩阵
给定一个包含 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 ]

java版本的代码实现:

package cn.cat.algorithm;


public class SpiralMatrix {
	/**
	 * 分析:定义上右下左四个数组下标边界,然后不断的依据从 右下左上 方向不断的内循环,同时更新相应的边界下标,直到输出所有节点才结束循环。
	 * 
	 * @Description: 
	 * @author gwj
	 * @Created 2018年4月16日 下午5:35:48 
	 * @param args
	 */
	public static void main(String[] args) {
		int m = 3, n = 3;
		int[][] nums = new int[][]{
			new int[]{1,2,3},
			new int[]{4,5,6},
			new int[]{7,8,9}
		};
		
		/* 
		 * 定义上右下左数组下标边界
		 * 矩阵上边:从0开始,即第一维数组的第一个元素。
		 * 矩阵右边:最大的列数,因为数组从0开始,故需要-1。
		 * 矩阵下标:最大的行数,因为数组从0开始,故需要-1。
		 * 矩阵左边:从0开始,即第二维数组的第一个元素。
		 * 
		 */
		int up = 0;
		int right = n - 1;
		int down = m - 1;
		int left = 0;
		
		StringBuilder opStr = new StringBuilder("[");
		while (true) {
			//从左往右
			for (int i = left; i <= right; i++) {
				opStr.append(nums[up][i]).append(",");
			}
			if (++up > down) {
				break;
			}
			
			//从上到下
			for (int i = up; i <= down; i++) {
				opStr.append(nums[i][right]).append(",");
			}
			if (--right < left) {
				break;
			}
			
			//从右往左
			for (int i = right; i  >= left ; i--) {
				opStr.append(nums[down][i]).append(",");
			}
			if (up > --down) {
				break;
			}
			
			//从下到上
			for (int i = down; i  >= up ; i--) {
				opStr.append(nums[i][left]).append(",");
			}
			if (right < ++left) {
				break;
			}
		}
		
		//删除最末尾多余的逗号
		opStr.deleteCharAt(opStr.length() - 1);
		opStr.append("]");
		
		System.out.println(opStr);
	}
}


猜你喜欢

转载自blog.csdn.net/u013777382/article/details/79969631