完整可运行代码剑指 Offer 29. 顺时针打印矩阵
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完整可运行代码剑指 Offer 29. 顺时针打印矩阵相关的知识,希望对你有一定的参考价值。
立志用最少的代码做最高效的表达
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
核心:本质为画图推导题,将矩阵拆分为四个部分考虑,逐个击破!!!
public class 剑指Offer29_顺时针打印矩阵 {
static class Solution {
public int[] spiralOrder(int[][] matrix) {
// 本质是规律题,拆分为四个部分考虑!!!
int row = matrix.length;
if(row == 0) return new int[0];
int col = matrix[0].length;
int[] res = new int[col*row];
int num = 0; // res数组的下标
int up = 0, right = col-1, down = row-1, left = 0; // 四个坐标的参数
while(num < col*row) {
// 上
for(int i = up; (i<=right) && (num<col*row); i++) // 多加的限定条件,为了防止越界访问,单行或单列的情况
res[num++] = matrix[up][i];
up++;
// 右
for(int i = up; (i<=down) && (num<col*row); i++)
res[num++] = matrix[i][right];
right--;
// 下
for(int i = right; (i>=left) && (num<col*row); i--)
res[num++] = matrix[down][i];
down--;
// 左
for(int i = down; (i>=up) && (num<col*row); i--)
res[num++] = matrix[i][left];
left++;
}
return res;
}
}
public static void main(String[] args) {
// int[][] m = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
// 奇数次序列
// int[][] m = new int[][]{{1,2,3,4,5},{16,17,18,19,6},{15,24,25,20,7},{14,23,22,21,8},{13,12,11,10,9}};
// 偶数次序列
// int[][] m = new int[][]{{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
// 只有1个数
// int[][] m = new int[][]{{1}};
// 行列不等
// int[][] m = new int[][]{{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
// 只有一行
int[][] m = new int[][]{{1,2,3,4}};
Solution solution = new Solution();
int[] nums = solution.spiralOrder(m);
for(int i = 0; i < nums.length; i++) {
System.out.println(nums[i] + " ");
}
}
}
天若有情天亦老,人间正道是沧桑。 ——教员
以上是关于完整可运行代码剑指 Offer 29. 顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章