首页 > 试题广场 >

转圈打印矩阵

[编程题]转圈打印矩阵
  • 热度指数:1556 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整型矩阵matrix,请按照顺时针转圈的方式打印它。
示例1

输入

[[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]

备注:
import java.util.*;
//  1 2 3
//  4 5 6
//  7 8 9
//  螺旋 1 2 3 6 9 8 7 4 5
public class Solution {
    public int[] printMatrix (int[][] matrix) {
        // 判断空
        if (matrix.length == 0 || matrix[0].length == 0) return null;
        // left   从1--2--3
        // right   从3--2--1
        // top   从1--4--7
        // bottom   从7--4--1
        int left = 0, right = matrix[0].length - 1;
        int top = 0, bottom = matrix.length - 1;
        // res[]的指针索引index
        int index = 0;
        // res[]的长度count==计算m*n
        int count = matrix.length * matrix[0].length;
        // 创建数组存放
        int[] res = new int[count];
        // 遍历
        while (top < (matrix.length+1)/2 && left < (matrix[0].length+1)/2) {
            // 1.上面1--2--3左往右
            for (int i = left; i <= right; i++) {
                res[index++] = matrix[top][i];  // 添加matrix[0][0],matrix[0][1],matrix[0][2]
            }
            // 2.右边3--6--9上往下,3(即matrix[0][2])已经添加,则top+1
            for (int i = top+1; i <= bottom; i++) {
                res[index++] = matrix[i][right];  // 添加matrix[1][2],matrix[2][2]
            }
            // 3.底面9--8--7右往左,9(即matrix[2][2])已经添加,则right-1
            // 上述条件top < (matrix.length+1)/2,以防矩阵过于大的时候重复
            for (int i = right-1; top != bottom && i >= left; i--) {
                res[index++] = matrix[bottom][i];  // 添加matrix[2][1],matrix[2][0]
            }
            // 4.左边7--4--1下往上,7(即matrix[2][0])已经添加,则bottom-1
            // 添加matrix[0][0]重复,冲突 top+1
            // 上述条件left < (matrix[0].length+1)/2,以防矩阵过于大的时候重复
            for (int i = bottom-1; left != right && i >= top+1; i--) {
                res[index++] = matrix[i][left];  // 添加matrix[1][0]
            }
            // 一圈后,top+1; bottom -1; left+1; right-1
            // 缩小范围
            top++;
            bottom--;
            left++;
            right--;
        }
        return res;
    }
}

发表于 2020-12-10 23:24:54 回复(0)
我特莫要是能有思路就不会跑到力扣上取经抄代码了,也不会告诉你们抄完了也似懂非懂的
发表于 2020-11-11 21:14:13 回复(0)
class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型vector
     */
    
    /*
    1  2  3  4  5
    6  7  8  9  10
    11 12 13 14 15
    
    
    */
    vector<int> printMatrix(vector<vector<int> >& matrix) {
        // write code here
        if (matrix .size() == 0) return {};
        int width = matrix[0].size();
        int heigh = matrix.size();
        int layer = (min(heigh,width) + 1) >> 1;
        // 层数 0 ~
        int i = 0;
        vector<int>  res;
            while ( i < layer ){
                // 横着: layer ~ width - layer
                // 举例: 0,0 0,5  | 1,1,1,4
                for (int  j = i ; j < width - i ; j ++) {
                       res.push_back( matrix[i][j]);
                }
                //竖着: j确定: i递减
                for (int row = i + 1; row < heigh - i ; row ++) {
                      res.push_back(matrix[row][width - 1 - i]) ; 
                }
                //反向横着
                for (int lay = width - 1 - i - 1; lay >= i && (heigh - 1 - i) != i ; lay --) {
                     res.push_back(matrix[heigh - 1 - i][ lay]);
                }
                
                // 反向竖着
                for (int row = heigh - 1 - i - 1;row >= i + 1 &&(width - 1 - i) != i ; row --) {
                     res.push_back( matrix[row][i] );
                }
                i ++;
            }
        return res;
    }
};

发表于 2022-07-17 16:05:20 回复(0)
如果你愿意一层一层的剥开我的心
function printMatrix( matrix ) {
    // write code here
    const res = []
    if(matrix.length==0) return []
     let top = 0,bottom = matrix.length-1,right= matrix[0].length-1,left=0
    while(left<right&&top<bottom){
    for(let i= left;i<right;i++) res.push(matrix[top][i])//上层
    for(let i = top;i<bottom;i++) res.push(matrix[i][right])//右层
    for(let i = right;i>left;i--) res.push(matrix[bottom][i])//下层
    for(let i = bottom;i>top;i--) res.push(matrix[i][left])//左层
        top ++
        bottom--
        left++
        right--
    }
   if(left==right){
       for(let i = top;i<=bottom;i++) res.push(matrix[i][right])//右层
   } else if(top == bottom){
      for(let i= left;i<=right;i++) res.push(matrix[top][i])//上层
   }
     return res
}

发表于 2020-12-25 12:04:45 回复(0)
一样的解题思路,我的运行时间确是人家的指数倍,害
#
# 
# @param matrix int整型二维数组 the matrix
# @return int整型一维数组
#
class Solution:
    def printMatrix(self , matrix ):
        # write code here
        ans = []
        line,row=len(matrix),len(matrix[0])
        count= row*line
        start,end=0,0
        i,j= 0,0
        while True:
            if count==0:return ans
            if i==start:
                for j in range(end,row):
                    ans.append(matrix[i][j])
                    count-=1
                start+=1

            if count==0:return ans
            if j==row-1:
                for i in range(start,line):
                    ans.append(matrix[i][j])
                    count-=1
                row-=1

            if count==0:return ans
            if i==line-1:
                for j in range(row-1,end-1,-1):
                    ans.append(matrix[i][j])
                    count-=1
                line-=1

            if count==0:return ans
            if j==end:
                for i in range(line-1,start-1,-1):
                    ans.append(matrix[i][j])
                    count-=1
                end+=1

编辑于 2020-12-14 14:01:52 回复(0)
class Solution {
    public int[] printMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        int m = matrix.length, n = matrix[0].length;
        int[] res = new int[m * n];
        int rowBegin = 0, rowEnd = m - 1, colBegin = 0, colEnd = n - 1;
        int index = 0;
        while (rowBegin <= rowEnd && colBegin <= colEnd) {
            for (int j = colBegin; j <= colEnd; j++) {
                res[index++] = matrix[rowBegin][j];
            }
            rowBegin++;

            for (int i = rowBegin; i <= rowEnd; i++) {
                res[index++] = matrix[i][colEnd];
            }
            colEnd--;

            if (rowBegin <= rowEnd) {
                for (int j = colEnd; j >= colBegin; j--) {
                    res[index++] = matrix[rowEnd][j];
                }
            }
            rowEnd--;

            if (colBegin <= colEnd) {
                for (int i = rowEnd; i >= rowBegin; i--) {
                    res[index++] = matrix[i][colBegin];
                }
            }
            colBegin++;
        }
        return res;
    }
}

发表于 2020-11-17 20:54:22 回复(0)
class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型vector
     */
    vector<int> printMatrix(vector<vector<int> >& matrix) {
        // write code here
        if (matrix.empty() || matrix[0].empty()) return {};
        int m = matrix.size(), n = matrix[0].size();
        int up = 0, down = m - 1, left = 0, right = n - 1;
        vector<int> res;
        while (true) {
            for (int j = left; j <= right; ++j) res.push_back(matrix[up][j]);
            if (++up > down) break;
            for (int i = up; i <= down; ++i) res.push_back(matrix[i][right]);
            if (--right < left) break;
            for (int j = right; j >= left; --j) res.push_back(matrix[down][j]);
            if (--down < up) break;
            for (int i = down; i >= up; --i) res.push_back(matrix[i][left]);
            if (++left > right) break;
        }
        return res;
    }
};
发表于 2020-10-19 19:50:51 回复(0)
class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型vector
     */
    vector<int> printMatrix(vector<vector<int> >& matrix) {
        // write code here
        if (matrix.empty() || matrix[0].empty()) return {};
        vector<int> res;
        int m = matrix.size(), n = matrix[0].size();
        int x = 0, y  = 0;
        int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
        int d = 0;  // 初始方向
        vector<vector<bool>> st(m, vector<bool>(n, false));
        for (int i = 0; i < m * n; i ++)
        {
            st[x][y] = true;
            res.push_back(matrix[x][y]);
            int nx = x + dx[d], ny = y + dy[d];
            if (nx < 0 || nx >= m || ny < 0 || ny >= n || st[nx][ny])
            {
                d = (d + 1) % 4;
                nx = x + dx[d], ny = y + dy[d];
            }
            x = nx, y = ny;
        }
        return res;
    }
};
发表于 2020-10-11 18:57:07 回复(0)