刷题LeetCode 剑指offer29

本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!!

第25道问题 剑指offer 29为一道简单题

题目:

力扣icon-default.png?t=L892https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/

1.自己思路 

将这个二维数组分成一圈一圈地加入到数组中,最大圈数为矩阵中最下行列数/2+1.

添加过程中先确定4个边界的值,之后分别循环放入到数组中。

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix==null||matrix.length==0||(matrix.length==1&&matrix[0].length==0)) {
          return new int[0];
        }

        int m = matrix.length;
        int n = matrix[0].length;
        int[] res = new int[m*n];
        int count=0;
        //最多可以打印几轮
        int len = Math.min(m/2,n/2)+1;
        for(int i=0;i<len;i++){
            //打印的四个边界值
            int l = i;
            int r = n-i-1;
            int low = i;
            int high = m-i-1;
            //打印上边的线
            if(l<=r && low<=high){
                for(int j=l;j<=r;j++){
                    if(count == m*n) break;
                   res[count++]=matrix[low][j];
                } 
            }
            //打印右侧的线
            if(l<=r && low<=high){
            for(int j=low+1;j<=high;j++){
              if(count == m*n) break;
              res[count++]=matrix[j][r];
            }
            }
            //打印下侧的线
            if(l<=r && low<=high){
            for(int j=r-1;j>=l;j--){
                if(count == m*n) break;
              res[count++]=matrix[high][j];
            }
            }
            //打印左侧的线
            if(l<=r && low<=high){
            for(int j=high-1;j>low;j--){
                if(count == m*n) break;
              res[count++]=matrix[j][l];
            }
            }
        } 
        return res;
    }
}

结果:

2.参考题解

1.构建一个Boolean 二维数组保存走过的路径,之后再确定边界条件,达到条件后更改方向。 

class Solution {
    public int[] spiralOrder(int[][] matrix) {
         if(matrix==null||matrix.length==0||(matrix.length==1&&matrix[0].length==0)) {
          return new int[0];
        }
        int m = matrix.length, n = matrix[0].length;
        boolean[][] visited = new boolean[m][n];
        int total = m * n;
        int[] order = new int[total];
        int row = 0, column = 0;
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int directionIndex = 0;
        for (int i = 0; i < total; i++) {
            order[i] = matrix[row][column];
            visited[row][column] = true;
            int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
            //边界条件,更改方向值
            if (nextRow < 0 || nextRow >= m || nextColumn < 0 || nextColumn >= n || visited[nextRow][nextColumn]) {
                directionIndex = (directionIndex + 1) % 4;
            }
            //一次次循环相加,真棒
            row += directions[directionIndex][0];
            column += directions[directionIndex][1];
        }
        return order;
    }
}

结果:

总结:

利用一个二维数组确定方向,这个方法好。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值