矩阵之螺旋矩阵

总体思路:

  • 注意遍历顺序 每次遍历一圈时候不要多加元素

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刷题之螺旋矩阵的更多相关文章

  1. leetcode刷题-59螺旋矩阵2

    题目 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 思路 与螺旋矩阵题完全一致 实现 class Solution: def generateM ...

  2. leetcode刷题-54螺旋矩阵

    题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...

  3. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  4. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  5. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...

  6. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  7. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  8. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  9. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

随机推荐

  1. VUE3 之 使用标签实现动画与过渡效果(下) - 这个系列的教程通俗易懂,适合新手

    1. 概述 毛毛虫效应: 有这样一个实验,将许多毛毛虫放在一个花盆边缘,使它们首尾相接,围成一个圈.然后在离花盆很近的地方撒了一些毛毛虫的食物. 此时,毛毛虫并不会向食物的方向爬去,而是在花盆边缘,一 ...

  2. tar包压缩时相对路径问题

    一.问题描述 现在有一个需求,不知道该如何才能实现压缩: tar -czvf /home/futong/test/logs.tar.gz /home/futong/test/logs 打开压缩包发现 ...

  3. react的”Hello World !“

    本文主要简述react的开始使用 1.引入js文件 <!-- 1.核心文件 --> <script crossorigin src="https://unpkg.com/r ...

  4. nginx 访问php文件报错

    问题图: An error occurred. 解决方法(windows版) php.cgi没有启动 cmd中找到cig.exe 的位置然后运行   php-cgi.exe -b 127.0.0.1: ...

  5. MM32F0020 UART1空闲中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1空闲中断和NVIC中断 3.编写MM32F0020 UART1中断接收和空闲中断函数 4.编写MM32F0020 UART1 ...

  6. LGP5795题解

    首先 \(k\) 大容易让我们想到 主席树&树套树&整体二分,而异或又让我们想到 01-Trie. 所以就有一个很明显的二分,二分一个 mid 看有多少个数不大于 mid. 然后发现 ...

  7. Java案例——统计字符串中各种字符出现的次数

    /*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...

  8. 使用 Docker 部署 LNMP 并搭建 wordpress

    准备 系统版本:CentOS Linux release 7.4.1708 (Core)   内核版本:3.10.0-693.el7.x86_64    IP:192.168.31.43    可访问 ...

  9. python中判断为None

    python中经常会有判断一个变量是否为None的情况,这里列举三种方式: if not x if x is None if not x is None *********************** ...

  10. vue学习过程总结(04) - 菜鸟教程归纳

    1.组件 组件(component)是vue.js最强大的功能之一.组件可以扩展html元素,封装可重用的代码.组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象 ...