力扣 54.螺旋矩阵

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

题解:

之前大一小学期做过类似的题,依稀记得需要很多的判断是否拐弯和拐弯之后要怎么操作的数组变量,于是试着写了一下,其实不难,但是需要找到规律,在第一圈的右下左上的时候有点特殊,就是左之后就需要进行stepx--和stepy--了,stepx和stepy是指示在x轴和y轴的该次移动需要总共走过多少步,比如示例2的1->2->3->4的这次移动的stepy就是3,4->8->12这次移动的stepx就是2,在走到9之后,就需要更新stepx和stepy了,将其自减。而在其他圈的循环过程中,每两次转弯进行一次stepx--和stepy--即可。规律不难找,可以自己画画试一下。

判断循环结束的条件就使用现在遍历输出到list中的数据大小和数组大小相同作为结束变脸的条件。

击败了1.2%的用户,不过这坨代码终究是过了。

代码实现

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
//控制方向:右下左上
        int[][] derection = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
            //初始化y轴方向的行走距离
            int stepy = matrix[0].length-1; //3
            //初始化x轴方向的行走距离
            int stepx = matrix.length-1;// 2(实际在“左”之后就要更新--)
            int cur = 0;//记录当前的行走方向 0-右 1-下 2-左 3-上
            //设置一个记录现在走了多少步的count
            int count = 1;
            //记录现在遍历到的数组元素
            List<Integer> list = new ArrayList<>();
            list.add(matrix[0][0]);
            int startx =0;
            int starty = 0;
            int posx = 0;
            int posy  =0;
            int size = matrix.length*matrix[0].length;
            //记录圈数
            int r = 1;
            //记录现在拐了几次
            int c = 0;
            //System.out.println("数组的大小:"+size);
            while(count!=size){
                for(cur = 0;cur<=3;cur++){

                    //向右走
                    if(cur==0){
                        for (int i = 0; i < stepy; i++) {
                            posx+=derection[0][0];
                            posy+=derection[0][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            System.out.println(count);
                            if(count==size){
                                break;
                            }
                        }
                    }
                    //向下走
                    else if(cur == 1){
                        for (int i = 0; i < stepx; i++) {
                            posx+=derection[1][0];
                            posy+=derection[1][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                    }
                    //向左走
                    else if(cur==2) {
                        for (int i = 0; i < stepy; i++) {
                            posx += derection[2][0];
                            posy += derection[2][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                        //向左走完之后需要更新stepx和stepy
                        if(r==1) {
                            stepx -= 1;
                            stepy -= 1;
                            c=-1;
                            System.out.println("现在该位置完成第三次拐弯,并且将stepx/y-1,c置0 "+stepx+" "+stepy+" "+c);
                        }
                    }

                    //向上走
                    else{
                        for (int i = 0; i < stepx; i++) {
                            posx += derection[3][0];
                            posy += derection[3][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                    }
                    c++;
                    if(c==2&&r!=1){
                        stepx--;
                        stepy--;
                        c=0;
                    }

                    if(count==size){
                        break;
                    }

                }
                System.out.println(r+"圈的stepx和stepy等于:"+stepx+" "+stepy);
                r++;
                // System.out.println("第一圈走完了,现在的count = "+count);
            }
            return list;
    }
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值