算法题:螺旋矩阵
给定一个包含 m x n 个要素的矩阵,(m 行, n 列),写一个函数按照螺旋顺序,返回该矩阵中的所有要素。
格式:
输入依次输入两个整数 m 和 n,和一个 m x n 的整数数组,最后输出按照螺旋顺序返回的矩阵数组的元素。
样例输入
m = 3
n = 3
[
[ 1,2,3 ],
[ 4,5,6 ],
[ 7,8,9 ]
]
样例输出
给定一个包含 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); } }