顺时针打印矩阵(数组)
来源:互联网 发布:ssd主控测试软件 编辑:程序博客网 时间:2024/05/21 09:10
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路一:设计一个函数,递归调用
import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { if (matrix == null || matrix.length == 0) return null; ArrayList<Integer> res = new ArrayList<>(); myPrint(matrix, 0, 0, matrix.length - 1, matrix[0].length - 1, res); return res; } public void myPrint(int[][] matrix, int startRow, int startCol, int endRow, int endCol, ArrayList<Integer> result) { if (startRow < endRow && startCol < endCol) { for (int j = startCol; j <= endCol; j++) result.add(matrix[startRow][j]); for (int i = startRow + 1; i <= endRow; i++) result.add(matrix[i][endCol]); for (int j = endCol - 1; j >= startCol; j--) result.add(matrix[endRow][j]); for (int i = endRow - 1; i >= startRow + 1; i--) result.add(matrix[i][startCol]); myPrint(matrix, startRow + 1, startCol + 1, endRow - 1, endCol - 1, result); } else if (startRow == endRow && startCol < endCol) for (int j = startCol; j <= endCol; j++) result.add(matrix[startRow][j]); else if (startRow < endRow && startCol == endCol) for (int i = startRow; i <= endRow; i++) result.add(matrix[i][startCol]); else if (startRow == endRow && startCol == endCol) result.add(matrix[startRow][startCol]); }}
m行,n列,循环的圈数为(Math.min(m, n) - 1) / 2 + 1;
第i圈中:
从左到右:行: i ; 列:i 到 n - 1 - i ; 列++
从上到下:行: i + 1 到 m - 1 - i ; 列:n - 1 - i; 行++
从右到左:行: m - 1 - i; 列:n - 1 - i - 1 到 i; 列--
从下到上:行: m - 1 - i - 1 到 i + 1; 列:i; 行--
import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { if (matrix == null || matrix.length == 0) return null; ArrayList<Integer> res = new ArrayList<>(); int m = matrix.length; int n = matrix[0].length; int circles = (Math.min(m,n) - 1) / 2 + 1; // 圈数 for (int i = 0; i < circles; i++) { for (int c = i; c <= n - 1 - i; c++) res.add(matrix[i][c]); for (int r = i + 1; r <= m - 1 - i; r++) res.add(matrix[r][n - 1 - i]); for (int c = n - 1 - i - 1; (c >= i) && (m -1 - i != i); c--) res.add(matrix[m - 1 - i][c]); for (int r = m - 1 - i - 1; (r >= i + 1) && (n - 1 - i != i); r--) res.add(matrix[r][i]); } return res; }}
阅读全文
0 0
- 顺时针打印矩阵(数组)
- 数据结构(顺时针打印矩阵)
- 顺时针打印矩阵或者 螺旋数组
- 剑指offer_数组---顺时针打印矩阵
- 顺时针打印矩阵 (JAVA实现)
- 顺时针打印矩阵 (JAVA实现)
- 面试算法(十九)顺时针打印矩阵
- LeetCode | Spiral Matrix(顺时针打印矩阵)
- (《剑指Offer》笔记)顺时针打印矩阵
- 剑指Offer:顺时针打印矩阵(JAVA)
- 剑指offer(21):顺时针打印矩阵
- 剑指offer(16)-顺时针打印矩阵
- 【Codewars-snail】顺时针打印矩阵(python)
- 顺时针打印矩阵(Java实现)
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- Lift Hopping UVA
- rocketmq测试1-rocketmq,2m2s集群搭建
- 关于stm32内存操作
- c++对文件进行操作之读取文件夹下面的图片名称
- 自旋锁原理及java自旋锁
- 顺时针打印矩阵(数组)
- Spring Bean的装配
- meshlab编译过程(2)-编译meshlab_full.pro
- Java改变生成随机数的平均值(改变生成随机数的概率)
- settings
- 使用Apriori算法进行关联分析
- android6.0 检查权限(兼容小米)
- Retrofit2
- 实验七:将menu设计为可重用的子系统