java 剑指offer之[数据结构 简单]JZ29 顺时针打印矩阵

题目的链接在这里: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;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值