题目的链接在这里:https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
题目大意
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: [[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] 数据范围: 0 <= matrix.length <= 100 0 <= matrix[i].length <= 100一、示意图
二、解题思路
错误示范和暴力
错误示范
代码如下:
package LeetCode;
import java.util.*;
public class Test11 {
//先设置向上走的 因为他一直不可以 所以可以排除
int stepX[]={0,1,0,-1};
int stepY[]={1,0,-1,0};
ArrayList<Integer> arrayList=new ArrayList<>();
boolean isVisited[][]=new boolean[100][100];
public ArrayList<Integer> printMatrix(int [][] matrix) {
//由外向里顺时针顺序打印每一个数字
//那就是 移动方向就是 向右走 然后向下走 然后向左走 然后向上走 然后再向右走
//那就把数组改成这样即可 正常的顺序即可 然后DFS
if(matrix==null)
return arrayList;
//先把第一个进去吧
isVisited[0][0]=true;
arrayList.add(matrix[0][0]);
dfs(0,0,matrix.length,matrix[0].length,matrix);
return arrayList;
}
private void dfs(int x, int y, int row, int col, int[][] matrix) {
//然后进行判断
for(int i=0;i<4;i++){
int newX=x+stepX[i];
int newY=y+stepY[i];
//然后进行判断 不越界 没访问过
if(newX>=0&&newX<row&&newY>=0&&newY<col&&!isVisited[newX][newY]){
//说明这个位置可以
//然后进行递归
arrayList.add(matrix[newX][newY]);
isVisited[newX][newY]=true;
dfs(newX,newY,row,col,matrix);
}
}
}
}
暴力
代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> arrayList=new ArrayList<>();
if(matrix==null)
return arrayList;
//low和high表示的是行数
int low=0;
int high=matrix.length-1;
//left和right表示的是 列数
int left=0;
int right=matrix[0].length-1;
while (low<=high&&left<=right){
//先向右边
for(int i=left;i<=right;i++){
arrayList.add(matrix[low][i]);
}
//向下 列不变 行边
for(int i=low+1;i<=high;i++){
arrayList.add(matrix[i][right]);
}
//然后是向左边 有可能出现只有一行的情况
if(low<high){
//说明不止一行
for(int i=right-1;i>=left;i--) {
arrayList.add(matrix[high][i]);
}
}
//然后是向上走 防止只有一列的情况
if(left<right){
//说明不止一列
for(int i=high-1;i>=low+1;i--){
arrayList.add(matrix[i][left]);
}
}
//一下操作之后 点会出现在起始点的向下一个位置 更新这些行数就行了
low++;
high--;
left++;
right--;
}
return arrayList;
}
}