面试热题(螺旋矩阵)

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

面试热题(螺旋矩阵)_第1张图片

 一看到这个大家有没有想到

面试热题(螺旋矩阵)_第2张图片

 就是一个螺旋形状,那这道题我们应该怎么解决?

面试热题(螺旋矩阵)_第3张图片

       我们先来仔细的看,它这种螺旋形状的遍历是先【右-下-左-上】,所以我们可以先设置4个变量,去控制我们所需要遍历形状的边界

        int m=matrix.length;
        int n=matrix[0].length;
        //上下左右进行遍历
        int up=0;
        int down=m-1;
        int left=0;
        int right=n-1;

那么循环结束的条件的是什么呢?

       我们是要将目标数组中的元素按照螺旋的规则加入一个list集合中,那么循环的条件是不是就是我们集合list中的元素小于目标数组中的元素时就可以执行遍历,上文易得数组中每一个小数组的长度为n,数组中的有m个小数组,数组中的元素我们是不是可以用数组的个数*每个数组的长度

while(list.size()

先进行上层的从左向右遍历:

 //将上层的元素从左往右开始遍历
            //遍历的条件是最上层不能大于最下层
            if(up<=down){
                //从左向右
                for(int i=left;i<=right;i++){
                    list.add(matrix[up][i]);
                }
                //上边界下移
                up++;
            }

再从最后一列从上往下遍历

//将最后一列的元素从上往下开始遍历
            if(left<=right){
                //从上到下
                for(int i=up;i<=down;i++){
                    list.add(matrix[i][right]);
                }
                //往左移一列
                right--;
            }

最后一层从右往左遍历

//将最后一行从右往左遍历
            if(up<=down){
                for(int i=right;i>=left;i--){
                    list.add(matrix[down][i]);
                }
                down--;
            }

第一列从下自上遍历

 //将第一列进行从小往上进行遍历
            if(left<=right){
                for(int i=down;i>=up;i--){
                    list.add(matrix[i][left]);
                }
                left++;
            }

你可能感兴趣的:(热题Hot100,矩阵,算法,线性代数)