【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

这篇具有很好参考价值的文章主要介绍了【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享


59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:
【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

1 <= n <= 20

思路:

本类型题目其实都不涉及什么算法,就是模拟螺旋顺序打印的过程,下面我们来模拟一下

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

但是我们可以看出,这样一圈一圈的模拟下去,边界条件非常多,很容易出错,这时候我们第一节学的二分法中用的循环不变量规则就非常重要了

矩阵的四条边要么一致遵循左闭右开,要么左开右闭
【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法
【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法

class Solution {
public:
    vector<vector<int>> generateMatrix(int n)
    {
        vector<vector<int>> res(n,vector<int>(n,0));
        int startx=0,starty=0;  //定义每循环一个圈的起始位置
        int loop=n/2; //每个圈循环几次,如果n为奇数3,那么loop=1,只循环一圈
        int mid=n/2;  //矩阵中间位置,例如n为3,中间的位置为【1,1】
        int count=1;  //用来给矩阵元素赋值的
        int offset=1; //用来控制循环遍历长度
        int i,j;
        while(loop--)
        {
            i=startx,j=starty;
            //左闭右开
            for(j=starty;j<starty+n-offset;j++) res[startx][j]=count++;
            for(i=startx;i<startx+n-offset;i++) res[i][j]=count++;
            for(;j>starty;j--) res[i][j]=count++;
            for(;i>startx;i--) res[i][j]=count++;
            //第二圈开始,起始位置要各自加一
            startx++,starty++;
            offset+=2;
        }
        //如果n为奇数,则需要单独给矩阵之间的位置赋值
        if(n%2) res[mid][mid]=count;
        return res;
    }
   
};

上面代码中已经把模拟过程详细讲解了一遍,这里再对以下两点特别说明一下:

  • starty+n-offset:为什么这里要加上起始位置,因为第二圈开始起始坐标不为0
  • offset+=2:为什么要加2,因为每走一圈就少了两端的元素,赋初值为1是因为遵循左闭右开的原则
  • 上边有3 * 3和4 * 4的模拟图

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法

输入: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[i].length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

做这道题目我们也是在遵循循环不变量规则,看下面的代码中我们用的前置++,而不是后置++,细品(左开右闭),这里判断循环结束的方法也非常巧妙,判断4个边界是否有冲突,有冲突就退出循环

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        
        vector<int> ans;
        if(!matrix.size()) return ans;
        int up=0,down=matrix.size()-1,left=0,right=matrix[0].size()-1;
        while(true)
        {
            for(int i=left;i<=right;++i) ans.push_back(matrix[up][i]);
            if(++up>down) break;
            for(int j=up;j<=down;++j) ans.push_back(matrix[j][right]);
            if(--right<left) break;
            for(int k=right;k>=left;--k) ans.push_back(matrix[down][k]);
            if(--down<up) break;
            for(int L=down;L>=up;--L) ans.push_back(matrix[L][left]);
            if(++left>right) break;
        }
        return ans;
    }
};

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59,# Leetcode | 代码随想录 | 专题化,leetcode,矩阵,算法

总结

做这种类型的题目就是要多画图模拟,思路清晰就好办了,还有就是注意边界条件(遵循循环不变量规则)文章来源地址https://www.toymoban.com/news/detail-567533.html

到了这里,关于【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录第二天|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

    第二天开始了, 一开始自己写,就只想到了先一个个平方,再排序(甚至打算手写排序循环,后来才发现c++有自带的排序函数sort(a.begin(),a.end()),c++真好,加油努力学习c++。 第二种方法然后看提示用双指针也完全没想出来,只能看文章了,泪 写完发现代码乱七八糟,要改。

    2024年02月13日
    浏览(38)
  • 代码随想录Day02:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 【 题目建议 】: 本题关键在于理解双指针思想 【随想录文章讲解】 【卡哥视频讲解】 方法一:暴力排序法 **思路:**先对数组中每个数进行平方运算,然后再排序 时间复杂度是 O(n + nlogn) 其中包括计算平方数组的O(n)和快速排序的O(nlogn),总体上是O(nlo

    2023年04月27日
    浏览(53)
  • 代码随想录 LeetCode数组篇 二分查找

    # (简单)704. 二分查找 题目链接 代码随想录 - 二分查找思路 二分查找,思路很简单,但是在while循环left和right的比较是写=还是,还有right=mid还是right=mid-1容易混淆 需要想清楚对区间的定义,是[left,right],还是[left,right) (版本一,左闭右闭版本) (版本二,左闭右开) 题目

    2024年02月02日
    浏览(57)
  • 代码随想录Day1 | 数组01- leetcode 704、27

    题目链接:二分查找 关键问题:         - 边界(left、right)、当前查找值(middle)                 - target大于当前查找值 -- 当前查找区域的右边,更改区间left                 - target小于当前查找值 -- 当前查找区域的左边,更改区间right                 - middle的计

    2024年02月16日
    浏览(47)
  • 【代码随想录-Leetcode第六题:209. 长度最小的子数组】

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 参考【代码随想录】 示例 1: 示例 3: 提示: 1 = target = 109 1 = nums.length

    2024年02月12日
    浏览(43)
  • 代码随想录第四天 两两交换链表中的节点

    题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 样例: 非递归实现 思路:1.先排除空节点和单个节点;2对于两个节点需要交换他们的顺序

    2024年04月16日
    浏览(47)
  • 代码随想录第四天|LeetCode24. 两两交换链表中的节点,LeetCode19.删除链表的倒数第N个节点,LeetCode面试题 02.07. 链表相交,LeetCode142.环形链表II

    LeetCode24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 思路: 先定义一个虚拟头结点方便操作。 再就是交换相邻两个元素了, 此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序 初始时,cur指向虚拟头结点,然后进行

    2024年02月09日
    浏览(40)
  • [自我记录]随想录刷题第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

     代码随想录打卡第二天, 新手自我记录一下刷题历程, 仅为自我打卡使用. 今天刷了三道主题, 第一道双指针和第三道模拟做出来了, 第二道写出了暴力解法但是提交leetcode超时了, 测试用例过了18/20, 看了carl哥答案以后自己重新补写了滑动窗口方法. 977. 有序数组的平方 简单题

    2024年02月05日
    浏览(45)
  • 代码随想录第6天| 哈希表理论基础 ,LeetCode242.有效的字母异位词,LeetCode349. 两个数组的交集,LeetCode202. 快乐数,LeetCode1. 两数之和

    哈希表(散列表)理论基础 : 哈希表是根据关键码的值而直接进行访问的数据结构。 直白来讲其实数组就是一张哈希表。   什么时候想到用哈希法, 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法 。 当我们遇到了要快速判断一个元素是否出现集

    2024年02月10日
    浏览(66)
  • 代码随想录Leetcode70. 爬楼梯

            空间复杂度为O(N),如果想要优化空间复杂度,则只用三个变量进行状态转移也可以,参考 代码随想录 Leetcode509. 斐波那契数-CSDN博客

    2024年02月19日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包