首页 > 其他分享 >54. 螺旋矩阵

54. 螺旋矩阵

时间:2024-11-16 19:56:46浏览次数:1  
标签:sy sx matrix 螺旋 54 矩阵 cnt ey ex

题目

自己尝试了好几次,才通过了

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ans;
        int x = matrix.size(), y = matrix[0].size();
        int sx = 0, ex = x - 1, sy = 0, ey = y - 1;
        int cnt = 0;
        while (sx < ex && sx < ey)
        {
            for (ey = y - 1 - cnt; sy != ey; sy++)
                ans.push_back(matrix[sx][sy]);
            for (ex = x - 1 - cnt; sx != ex; sx++)
                ans.push_back(matrix[sx][sy]);
            for (ey = cnt; sy != ey; sy--)
                ans.push_back(matrix[sx][sy]);
            for (ex = cnt; sx != ex; sx--)
                ans.push_back(matrix[sx][sy]);
            cnt++;
            sx = sy = cnt;
            ex = x - 1 - cnt, ey = y - 1 - cnt;
        }
        if (sx == ex)
        {
            for (ey = y - 1 - cnt; sy <= ey; sy++)
                ans.push_back(matrix[sx][sy]);       
        }
        else if (sy == ey)
        {
            for (ex = x - 1 - cnt; sx <= ex; sx++)
                ans.push_back(matrix[sx][sy]);
        }
        return ans;
    }
};

这道题的思路一开始是借助卡哥讲的一道类似题59.螺旋矩阵II里面的一句话:左闭右开填充。

然后就这么盲目的做了,然后当然就是报错啦。

错误的写法:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ans;
        int x = matrix.size(), y = matrix[0].size();
        int sx = 0, ex = 0, sy = 0, ey = 0;
        int cnt = - 1, n = 0;

        if (min(x, y) % 2 == 0)
            n = min(x, y) / 2;
        else
            n = min(x, y) / 2 + 1;
        while (++cnt < n)
        {
            sx = sy = cnt;
            for (ey = y - 1 - cnt; sy != ey; sy++)
                ans.push_back(matrix[sx][sy]);
            for (ex = x - 1 - cnt; sx != ex; sx++)
                ans.push_back(matrix[sx][sy]);
            for (ey = cnt; sy != ey; sy--)
                ans.push_back(matrix[sx][sy]);
            for (ex = cnt; sx != ex; sx--)
                ans.push_back(matrix[sx][sy]);
        }
    }
};

这个连样例是matrix = [[1,2,3],[4,5,6],[7,8,9]]都没通过。

为啥,分析了一下,见图:

img

img

img

因此要单独考虑线和点的情况,while循环里面考虑的只是圈的情况,那么为了让while循环里面考虑的只是圈的情况,就要在while循环的控制条件上做文章了,写成while (sx < ex && sx < ey)能保证在while循环里面是个圈。

然后单独考虑线和点的情况的代码如下:

if (sx == ex)
    {
        for (ey = y - 1 - cnt; sy <= ey; sy++)
            ans.push_back(matrix[sx][sy]);       
    }
    else if (sy == ey)
    {
        for (ex = x - 1 - cnt; sx <= ex; sx++)
            ans.push_back(matrix[sx][sy]);
    }

注意不能写成

if (sx == ex)
    {
        for (ey = y - 1 - cnt; sy <= ey; sy++)
            ans.push_back(matrix[sx][sy]);       
    }
    else (sy == ey)
    {
        for (ex = x - 1 - cnt; sx <= ex; sx++)
            ans.push_back(matrix[sx][sy]);
    }

这样的写法会让点的情况下,该点被重复填充两次。

标签:sy,sx,matrix,螺旋,54,矩阵,cnt,ey,ex
From: https://www.cnblogs.com/hisun9/p/18549755

相关文章

  • (nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)
    题目:3240.最少翻转次数使二进制矩阵回文II思路:分类讨论,需要对行和列的个数进行讨论,时间复杂度为0(nm),细节看注释。C++版本:classSolution{public:intminFlips(vector<vector<int>>&grid){intans=0;intn=grid.size(),m=grid[0].size();......
  • 2024-11-16 特殊矩阵的压缩存储
    一、数组的存储结构1.一维数组:各元素大小相同,且物理上连续存放。a[i]=起始地址+i*siezof(数组元素大小)2.二维数组:b[j][j]=起始地址+(i*N+j)*sizeof(数组元素大小)二、特殊矩阵1.普通矩阵的存储:使用二维数组来存储。2.对称矩阵的压缩存储:若n阶方阵中任意一个元素aij都有ai......
  • 本地oracle数据库实例启动报错 TNS-12545 TNS-12560 TNS-00515
    oracle实例启动报错TNS-12545TNS-12560TNS-00515具体提示如下:监听该对象时出错:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.docker.internal)(PORT=1521)))TNS-12545:因目标主机或对象不存在,连接失败TNS-12560:TNS:协议适配器错误TNS-00515:因目标主机或对......
  • CMPEN/EE 454 oncamera projection
    1CMPEN/EE454,Project2,Spring2024DueWedsFriday2911:59PMonCanvas1Motivationhisgoalofthisprojectistohelpyouunderstandinapracticalwaythecoursematerialoncameraprojection,triangulation,epipolargeometry,andplanewarpingYouwi......
  • LeetCode654.最大二叉树
    LeetCode刷题记录文章目录......
  • cmu15545笔记-Join算法(Join Algorithms)
    目录OverviewNestedLoopJoinNaïveBlockIndexSort-MergeJoinHashJoinSimpleHashJoinPartitionHashJoin总结Overview输出形式:早物化与晚物化(OLAP一般都是晚物化)代价分析:一般用IO次数计算(最终结果可能落盘,也可能不落盘,所以我们只计算输出结果之前的IO次数)。Join左边称为......
  • 短视频矩阵:开启现代营销爆款密码,你还在等什么?
    在当今时代,短视频已然成为一种极为普遍且备受欢迎的信息传播形式。而短视频矩阵,在这一潮流趋势之下,犹如一座极具策略价值的广阔舞台,为众多品牌、创作者以及营销人士提供了无限可能。接下来,本文将深入剖析短视频矩阵的定义、构建之法及其在现代营销领域所产生的深远影响力。一......
  • 矩阵系统源码搭建的技术难点剖析,开源部署,OEM
    一、引言在当今数字化时代,矩阵系统在众多领域如数据分析、多平台管理、资源整合等方面发挥着至关重要的作用。然而,其源码搭建并非易事,涉及到诸多复杂的技术层面,存在不少技术难点需要开发者去攻克。本文将深入探讨矩阵系统源码搭建过程中常见的技术难点,以期为相关开发者提供有......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • cmu15545笔记-排序和聚合算法(Sorting&Aggregation Algorithms)
    目录概述排序堆排序外部归并排序使用索引聚合操作排序聚合哈希聚合概述本节和下一节讨论具体的操作算子,包括排序,聚合,Join等。排序为什么需要排序操作:关系型数据库是无序的,但是使用时往往需要顺序数据(OrderedBy,GroupBy,Distinct)。主要矛盾:磁盘很大:要排序的数据集很大,内......