首页 > 试题广场 >

螺旋矩阵

[编程题]螺旋矩阵
  • 热度指数:1222 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个包含 m x n 个元素的矩阵(m , n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素
示例1

输入

[[1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ]

输出

[1,2,3,4,8,12,11,10,9,5,6,7]
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 
# @param matrix int整型二维数组 
# @return int整型一维数组
#
class Solution:
    def SpiralMatrix(self , matrix ):
        # write code here
        # 1  2  3  4
        # 5  6  7  8
        # 9 10 11 12 
        if not matrix: return []
        if len(matrix) and not len(matrix[0]):return []
        if len(matrix)==1:return matrix[0]
        #res初始化
        res = [0 for _ in range(len(matrix)*len(matrix[0]))]
        #初始化边界
        up_bound, left_bound, down_bound, right_bound = 0, 0, len(matrix)-1, len(matrix[0])-1
        #打印并收缩边界
        idx = 0
        while True:
            #向右
            for col in range(left_bound,right_bound+1):
                res[idx] = matrix[up_bound][col]
                idx+=1
            up_bound+=1
            if up_bound>down_bound:break
            #向下
            for row in range(up_bound,down_bound+1):
                res[idx] = matrix[row][right_bound]
                idx += 1
            right_bound-=1
            if left_bound > right_bound:break
            #向左
            for col in range(right_bound,left_bound-1,-1):
                res[idx] = matrix[down_bound][col]
                idx += 1
            down_bound -= 1
            if up_bound > down_bound:break
            #向上
            for row in range(down_bound,up_bound-1,-1):
                res[idx] = matrix[row][left_bound]
                idx+=1
            left_bound+=1
            if left_bound>right_bound:break
        return res 

发表于 2021-08-11 23:27:36 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param matrix int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> SpiralMatrix(vector<vector<int> >& matrix) {
        int m = matrix.size();
        if(!m) return {};
        int n = matrix[0].size();
        if(!n) return {};
        vector<int> ans;
        int a = min(m, n);
        
        for(int l = 0; l < a/2; ++l){
            for(int i = l; i < n-1-l; ++i) ans.push_back(matrix[l][i]);
            for(int i = l; i < m-1-l; ++i) ans.push_back(matrix[i][n-1-l]);
            for(int i = n-1-l; i > l; --i) ans.push_back(matrix[m-1-l][i]);
            for(int i = m-1-l; i > l; --i) ans.push_back(matrix[i][l]);
        }
        if(a%2){
            if(m > n){
                for(int i = a/2; i < m-a/2; ++i) ans.push_back(matrix[i][a/2]);
            }else{
                for(int i = a/2; i < n-a/2; ++i) ans.push_back(matrix[a/2][i]);
            }
        }
        return ans;
    }
};
发表于 2021-08-03 17:02:38 回复(0)
import java.util.*;
public class Solution {
    public int[] SpiralMatrix (int[][] matrix) {
        int m=matrix.length,n=matrix[0].length;
        int index=0;
        int l=0,r=n-1,t=0,b=m-1;//左右上下边界
        int[] res=new int[m*n];
        while(true){
            //从左往右
            for(int i=l;i<=r;i++)res[index++]=matrix[t][i];
            if(++t>b) break;
            //从上往下
            for(int i=t;i<=b;i++) res[index++]=matrix[i][r];
            if(--r<l) break;
            //从左往右
            for(int i=r;i>=l;i--) res[index++]=matrix[b][i];
            if(--b<t) break;
            //从下往上
            for(int i=b;i>=t;i--) res[index++]=matrix[i][l];
            if(++l>r)break;
        }
        return res;
    }
}

发表于 2021-04-11 15:56:23 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# @param matrix int整型二维数组
# @return int整型一维数组
#
class Solution:
    def SpiralMatrix(self, matrix):
        if not matrix:
            return []
        res = []
        while matrix:
            # 取出第一行内容加入到 res 中
            res += matrix.pop(0)
            # 添加完成后如果还留有内容且不为空
            if matrix and matrix[0]:
                # 遍历行,取出最后一个元素加到 res 中
                for row in matrix:
                    res.append(row.pop())
            # 如果依旧有内容,选择最后一行,倒序加入 res 中
            if matrix:
                res += matrix.pop()[::-1]
            # 如果依旧有内容且不为空,则倒序遍历列,将第0个元素加入到 res 中
            if matrix and matrix[0]:
                for row in matrix[::-1]:
                    res.append(row.pop(0))
        return res

发表于 2022-11-28 19:01:20 回复(0)
function SpiralMatrix( matrix ) {
    // write code here
    // 矩阵为空的情况
    if(matrix.length === 0) return []
    // 定义边界条件,分别是四个方向上下左右
    let top = 0
    let bottom = matrix.length - 1
    let left = 0
    let right = matrix[0].length - 1
    // 旋转方向
    let direction = "right"
    // 定义一个接收答案的数组
    let result = []
    // 开始循环的条件,方向是右下左上
    while(left<=right && top<=bottom){
        // 方向向右时
        if(direction === "right"){
             for(let i=left;i<=right;i++){  // 循环遍历矩阵的top行
                 result.push(matrix[top][i])  // 将矩阵的top行中的每一个元素都push到result数组
             }
            top++
            direction = "down"  // 将方向改为向下
        }
        // 方向向下时
        else if(direction === "down"){
             for(let i=top;i<=bottom;i++){  // 循环遍历矩阵的right列
                 result.push(matrix[i][right])  // 将矩阵的right列中的每一个元素都push到result数组
             }
            right--
            direction = "left"  // 将方向改为向左
        }
        // 方向向左时
        else if(direction === "left"){
             for(let i=right;i>=left;i--){
                 result.push(matrix[bottom][i])
             }
            bottom--
            direction = "top"  // 将方向改为向上
        }
        // 方向向右时
        else if(direction === "top"){
             for(let i=bottom;i>=top;i--){
                 result.push(matrix[i][left])
             }
            left++
            direction = "right"  // 将方向改为向右
        }
    }
    return result
}

发表于 2022-06-15 11:13:11 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param matrix int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> SpiralMatrix(vector<vector<int> >& matrix) {
        vector<int> res;
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return res;
        }

        int row = matrix.size(), col = matrix[0].size();
        int left = 0, right = col - 1, top = 0, bottom = row - 1;
        while (left <= right && top <= bottom) {
            for (int j = left; j <= right; j++)   res.push_back(matrix[top][j]);
            for (int i = top + 1; i <= bottom; i++)   res.push_back(matrix[i][right]);
            if (left < right && top < bottom) {
                for (int j = right - 1; j > left; j--)   res.push_back(matrix[bottom][j]);
                for (int i = bottom; i > top; i--)   res.push_back(matrix[i][left]);
            }
            ++left;
            --right;
            ++top;
            --bottom;
        }
        return res;
    }
};
发表于 2022-05-02 10:05:28 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param matrix int整型二维数组 
     * @return int整型一维数组
     */
    public int[] SpiralMatrix (int[][] matrix) {
        // write code here
        int m=matrix.length;
        int n=matrix[0].length;
        int[] array=new int[m*n];
        int now=0,col=0,index=0;
        int[][] arr={{0,1},{1,0},{0,-1},{-1,0}};//记录数组
        int[][] use=new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                use[i][j]=0;
            }
        }
        for(int i=0;i<m*n;i++){
            array[i]=matrix[now][col];
            use[now][col]=1;
            int nextnow=now+arr[index][0];
            int nextcol=col+arr[index][1];
            if(nextcol<0||nextcol>=n||nextnow>=m||use[nextnow][nextcol]==1){
                index=(index+1)%4;
            }
            
            now+=arr[index][0];
            col+=arr[index][1];
        }
        return array;
    }
}

发表于 2022-03-06 17:12:14 回复(0)
func SpiralMatrix( matrix [][]int ) []int {
    // write code here
     
    var rtArray []int;
     
    var endRow int = len(matrix) -1
    endCol := len(matrix[0]) -1
    startCol := 0
    startRow := 0
    
    for {
        if (startRow > endRow) || (startCol > endCol) {
            break
        }
         
        for i := startCol; i < endCol + 1; i++{
            rtArray = append(rtArray, matrix[startRow][i] )
        }
         
        startRow += 1
 
        if (startRow > endRow) || (startCol > endCol) {
            break
        }
         
        for i := startRow; i < endRow + 1; i++{
            rtArray = append(rtArray, matrix[i][endCol] )
        }
         
        endCol -= 1
 
        if (startRow > endRow) || (startCol > endCol) {
            break
        }
 
        for i := endCol; i > startCol - 1; i-- {
            rtArray = append(rtArray, matrix[endRow][i] )
        }
        endRow -= 1
 
        if startRow > endRow || startCol > endCol {
            break
        }
         
        for i := endRow; i > startRow - 1; i-- {
            rtArray = append(rtArray, matrix[i][startCol] )
        }
        startCol += 1
    }
     
    return rtArray
}

发表于 2022-01-20 21:36:08 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param matrix int整型二维数组 
     * @return int整型一维数组
     */
    public int[] SpiralMatrix (int[][] matrix) {
        // write code here
        int m = matrix.length;//m行
        int n = matrix[0].length;//n列
        int up = 0;//上指针,索引
        int down = m-1;//下指针,索引
        int left = 0;//左指针,索引
        int right = n-1;//右指针,索引
        int[] result = new int[m*n];
        int index = 0;
        while(true) {
            //从左往右,遍历到右指针处
            for (int i =left; i<= right;i++) {
                result[index++] = matrix[up][i];
            }
            //上指针向下移动,++
            if (up++ == down) {
                break;
            }
            //从上往下遍历,遍历到下指针处
            for (int i = up;i <= down;i++) {
                result[index++] = matrix[i][right];
            }
            //右指针左移动,--
            if (right-- == left) {
                break;
            }
            //从右边往左边遍历,遍历到左指针处
            for (int i = right; i >=left;i--) {
                result[index++] = matrix[down][i];
            }
            //下指针上移;--
            if (down-- == up) {
                break;
            }
            //从下往上遍历,遍历到上指针处
            for (int i = down; i >= up;i--) {
                result[index++] =  matrix[i][left];
            }
            //左指针右移;++
            if (left++ == right) {
                break;
            }
        }
        return result;
    }
}


发表于 2021-11-14 15:25:00 回复(0)
classSolution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param matrix int整型vector<vector<>>
     * @return int整型vector
     */
    vector<int> SpiralMatrix(vector<vector<int> >& matrix) {
         
        intN = matrix.size() * matrix[0].size();
        vector<int> ans(N,0);
        intup,down,left,right;
        up = 0;
        down = matrix.size();
        left = 0;
        right = matrix[0].size();
        intindex = 0;
        while(index != N)
        {
            for(inti = left;i < right;i++)ans[index++] = matrix[up][i];
            for(inti = up+1;i < down;i++)ans[index++] = matrix[i][right-1];
            for(inti = right-2;i >= left;i--)ans[index++] = matrix[down-1][i];
            for(inti = down-2;i >= up+1;i--)ans[index++] = matrix[i][left];
            ++left;
            ++up;
            --down;
            --right;
        }
        return ans;
    }
};

逻辑应该是对的,就是不太明白为什么最后两例超时。不太清楚优化空间在哪。
ans数组不选择用直接赋值而是用push_back一个个塞进去也是超时。

发表于 2021-09-15 23:23:12 回复(0)