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

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

1.题目(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

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;
    }
};
相关推荐
爱读书的小胖18 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌18 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F18 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791318 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032219 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!19 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
2501_9269783319 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师19 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_19 小时前
10.11日常训练
算法
Code_Solitude19 小时前
c语言:关于qsoet函数知识点
c语言·数据结构·算法