每日一题(LeetCode)----数组--螺旋矩阵(一)

每日一题(LeetCode)----数组--螺旋矩阵(一)

1.题目(54. 螺旋矩阵

给你一个 mn 列的矩阵 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

2.解题思路

思路一

1.我们先根据矩阵的行数和列数(行数/2和列数/2中较小的那个就是循环的次数)确定要从左到右,从上到下,从右到左,从下往上循环几次,

2.然后我们进行遍历,把遍历到的元素放到新创建的vector中,每次遍历一个循环之后,下一次遍历循环的初始位置是当前循环的x坐标+1,y坐标+1(注意刚开始遍历时循环的初始位置是0,0),并且下一次遍历循环的每一条边的长度都要减一

3.填补中间位置

1>如果矩阵的行数和列数有一个小于二,那不用填补中间位置

2>如果矩阵的行数和列数都大于2了,那么看行数和列数谁更小,判断小的那个是不是偶数

如果是,那么结束操作

如果不是且当前列数较大,那么从当前位置向右继续遍历列数-行数+1个元素,并放入到新创建的vector中

如果不是且当前行数较大,那么从当前位置向下继续遍历行数-列数+1个元素,并放入到新创建的vector中

4.返回新创建的vector,操作结束

注意:如果行数等于1或者列数等于1要进行特别判断

​ 如果行数等于1,那么我们从初始位置向右遍历m个元素,并放入到新创建的vector中,然后返回新创建的vector中即可

​ 如果列数等于1,那么我们从初始位置向下遍历m个元素,并放入到新创建的vector中,然后返回新创建的vector中即可

3.写出代码

c++ 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        vector<int> res(m*n,0);
        int dirx=0;
        int diry=0;
        int loop=min(m/2,n/2);
        int offset=1;
        int count=0;
        if(n==1){
            while(m--){
                res[count]=matrix[count][0];
                count++;
            }
            return res;
        }
        if(m==1){
            while(n--){
                res[count]=matrix[0][count];
                count++;
            }
            return res;
        }
        while(loop--){
            int i=dirx;
            int j=diry;
            //从左到右
            for(;j<n-offset;j++){
                res[count++]=matrix[i][j];
            }
            //从上到下
            for(;i<m-offset;i++){
                 res[count++]=matrix[i][j];
            }
            //从右到左
            for(;j>diry;j--){
                res[count++]=matrix[i][j];
            }
            //从下往上
            for(;i>dirx;i--){
                 res[count++]=matrix[i][j];
            }
            dirx++;
            diry++;
            offset++;
        }
        if(m%2!=0&&n>=m&&m>2&&n>2){
            int t=n-m+1;
            while(t--){
                res[count++]=matrix[dirx][diry];
                diry++;
            }
        }
        if(n%2!=0&&m>n&&m>2&&n>2){
            int t=m-n+1;
            while(t--){
                res[count++]=matrix[dirx][diry];
                dirx++;
            }
        }
        return res;
    }
};
相关推荐
通信小呆呆12 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
Bobolink_12 小时前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
benben04412 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
何以解忧,唯有..13 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
想吃火锅100514 小时前
【leetcode】88.合并两个有序数组js
算法
生成论实验室15 小时前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Qres82115 小时前
算法复键——树状数组
数据结构·算法
H1785350909615 小时前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks
不会就选b15 小时前
算法日常・每日刷题--<二分查找>3
算法