每日一题(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;
    }
};
相关推荐
格林威6 分钟前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
程序员莫小特2 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土3 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.3 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
Dream it possible!3 小时前
LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)
leetcode·面试·散列表
蒙奇D索大3 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
智驱力人工智能4 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
学学学无无止境4 小时前
组合两个表-力扣
leetcode
程序员爱钓鱼5 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go
_Power_Y5 小时前
Java面试常用算法api速刷
java·算法·面试