Leetcode刷题之螺旋矩阵
矩阵之螺旋矩阵
总体思路:
- 注意遍历顺序 每次遍历一圈时候不要多加元素
Leetcode54螺旋矩阵
- 给你一个 m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
    public List<Integer> spiralOrder(int[][] matrix) {
        LinkedList<Integer> res=new LinkedList<>();
        int num=matrix.length*matrix[0].length;//总元素个数
        int top=0;
        int bottom=matrix.length-1;
        int left=0;
        int right=matrix[0].length-1;
        int offset=1;//偏移量
        while(num>=1){
            //从左到右 包括上面全部数据
            for(int i=left;i<=right && num>=1;i++){
                res.add(matrix[top][i]);
                num--;
            }
            //从上到下 最上面元素不包括
            for(int i=top+offset;i<=bottom && num>=1;i++){
                res.add(matrix[i][right]);
                num--;
            }
            //从右到左 最右边元素不包括
            for(int i=right-offset;i>=left && num>=1;i--){
                res.add(matrix[bottom][i]);
                num--;
            }
            //从下到上  最上面和最下面元素不包括
            for(int i=bottom-offset;i>=top+offset && num>=1;i--){
                res.add(matrix[i][left]);
                num--;
            }
            top++;
            bottom--;
            left++;
            right--;
        }
        return res;
    }
- 我采用的是下面这种循环遍历方式 
 
- 为了对称 也完全可以采取以下遍历方式 
 
- 但是采用第二种方式 要对最后一行数组进行单独处理(因为无法进入任何一次之前的循环) 
- 而采用第一种遍历方式的话 最后一行就不需要特殊处理啦 
Leetcode59螺旋矩阵二
- 给你一个正整数 n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
 public int[][] generateMatrix(int n) {
        int[][] res=new int[n][n];
        int num=1;
        int target=n*n;
        int top=0;
        int bottom=n-1;
        int left=0;
        int right=n-1;
        int offset=1;//偏移量
        while(num<=target){
             //从左到右 包括上面全部数据
            for(int i=left;i<=right && num<=target;i++){
                res[top][i]=num;
                num++;
            }
            //从上到下 最上面元素不包括
            for(int i=top+offset;i<=bottom && num<=target;i++){
                res[i][right]=num;
                num++;
            }
            //从右到左 最右边元素不包括
            for(int i=right-offset;i>=left && num<=target;i--){
                res[bottom][i]=num;
                num++;
            }
            //从下到上  最上面和最下面元素不包括
            for(int i=bottom-offset;i>=top+offset && num<=target;i--){
                res[i][left]=num;
                num++;
            }
            top++;
            bottom--;
            left++;
            right--;
        }
        return res;
    }
- 方式二 采用上面第二个图的对称方式来遍历
 public int[][] generateMatrix(int n) {
        int[][] res=new int[n][n];
        //循环次数
        int loop=n/2;
        //循环起始位置
        int loopx=0;
        int loopy=0;
        //偏移量
        int offset=1;
        //填充数字
        int count=1;
        //开始循环
        while(loop>0){
            int i=loopx;
            int j=loopy;
            //从左到右
            for(;j<loopy+n-offset;j++){
                res[i][j]=count++;
            }
            //从上到下
            for(;i<loopx+n-offset;i++){
                res[i][j]=count++;
            }
            //从右到左
            for(;j>loopy;j--){
                res[i][j]=count++;
            }
            //从下到少年宫
            for(;i>loopx;i--){
                res[i][j]=count++;
            }
            //一次循环结束
            loop--;
            loopx+=1;
            loopy+=1;
            offset+=2;
        }
        //奇数特殊处理
        int mid=n/2;
        if(n%2==1){
            res[mid][mid]=count++;
        }
        return res;
    }
Leetcode刷题之螺旋矩阵的更多相关文章
- leetcode刷题-59螺旋矩阵2
		题目 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 思路 与螺旋矩阵题完全一致 实现 class Solution: def generateM ... 
- leetcode刷题-54螺旋矩阵
		题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ... 
- LeetCode刷题总结-数组篇(中)
		本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ... 
- C#LeetCode刷题-数组
		数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ... 
- C#LeetCode刷题-数学
		数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ... 
- leetcode刷题目录
		leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ... 
- LeetCode刷题指南(字符串)
		作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ... 
- LeetCode刷题总结-数组篇(上)
		数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ... 
- LeetCode刷题总结-数组篇(下)
		本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ... 
随机推荐
- kibana操作记录
			GET _search { "query": { "match_all": {} } } GET _cat/nodes GET _cat/health GET ... 
- 哈工大 计算机系统 大作业 程序人生-Hello’s P2P
			计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 班 级 学 生 指 导 教 师 计算机科学与技术学院 2021年6月 摘 要 本文主要通过分析hello这个程序的 ... 
- Azure DevOps (三) 实现和Jenkins的联动
			上一篇文章中,我们通过azure 的webhook实现了和钉钉机器人的联动,实现了通过钉钉机器人告知大家刚才谁动了仓库. 在文章开篇的时候我们举例说了jenkins也可以实现和azure联动,今天我们 ... 
- Spring源码之九finishRefresh详解
			Spring源码之九finishRefresh详解 公众号搜索[程序员田同学],专职程序员兼业余写手,生活不止于写代码 Spring IoC 的核心内容要收尾了,本文将对最后一个方法 finishRe ... 
- oop简易封装增删改查
			//注意要先引入含有封装类的文件文件:如下: <?phpclass Db{ public $host='127.0.0.1'; public $user='root'; public $pass ... 
- 微信公众号客服接口:out of response count limit 的原因
			调用客服消息接口返回如下: ... 
- Fiddler抓取https协议的证书导入过程
			fildder抓取https的设置以及证书导出 打开fiddler界面,选择左上角菜单栏Tools-Options 出现Options界面后,选择HTTPS选项卡 勾选上Capture HTTPS C ... 
- 关于DP动规
			今天学了动规,简单记录一下自己理解了的:(要不俺就忘了) 首先,啥是DP??? 动态规划,其实就是组合子问题的解来解决整个问题的解,由于每个子问题他只判断一次,所以不会重复计算,那就很牛啊!!! 专业 ... 
- Docker——常用命令
			常用命令 docker version # 显示docker的版本信息 docker info # 显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help # 帮助命令,中 ... 
- linux mac 命令行 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
			➜ ~ ssh adleytales@192.168.1.10 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNIN ... 
