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