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 ...
随机推荐
- 【C# 程序集】.net core 3.0中动态卸载|卸载程序集
原文:https://docs.microsoft.com/zh-cn/dotnet/core/dependency-loading/understanding-assemblyloadcontext ...
- Qt:如何生成可执行文件
参考 (18条消息) QT5的程序打包发布(将QT5的工程项目打包成一个exe程序)_kslly的专栏-CSDN博客 环境配置 Windows 10系统 MSVC 2017编译器 工具 Qt 5自带的 ...
- C#中?和:?和??代表什么
?代表可空类型修饰符 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:带便三元表达式 int a=b>c?b:c 如果 ...
- JZ-017-树的子结构
树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目链接: 树的子结构 代码 /** * 标题:树的子结构 * 题目描述 * 输入两棵 ...
- jmeter + tomcat + ant + svn +jenkins 实现持续集成测试
l 安装jdk时候需要提前检查jdk是否安装成功 l 在dos下输入javac java -version l l 安装jmeter l 校验是否安装成功: l 进入jmeter目录下bin ...
- DBScan聚类,打破形状的限制,使用密度聚类
如何用花盆摆放成国庆字,并且包围这两个字. 在DBSCAN中衡量密度主要使用的指标:半径.最少样本量 算法原理 *直接密度可达 如果一个点在核心对象的半径区域内,那么这个点和核心对象称为直接密度可达, ...
- 七天接手react项目 —— state&事件处理&ref
state&事件处理&ref 在 react 起步 一文中,我们学习了 react 相关知识:jsx.组件.props.本篇将继续研究 state.事件处理和ref. state St ...
- freeswitch tts_commandline模块介绍
概述 freeswitch是开源.免费的VOIP软交换平台,自带了很多功能各异的模块. mod_tts_commandline模块,本身没有TTS能力,而是通过调用TTS引擎的命令生成语音文件,tts ...
- java反射之java 泛型的本质
1.泛型 反射API用来生成在当前JAVA虚拟机中的类.接口或者对象的信息.Class类:反射的核心类,可以获取类的属性,方法等内容信息.Field类:Java.lang.reflect.表示类的属性 ...
- 不带头结点的单链表(基于c语言)
本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...