简介

忘不了, 这是华为面试官给我的面试题, 但是我没有在1分钟内做出来. 或许那个时候面试官本来就不想要一个人.

使用模拟的方法.

使用一个visited数组, 判断是否走到边界, 只有四个方向:

  1. j++
  2. i++
  3. j--
  4. i--

    依次循环.

code

class Solution {
public:
vector<int> res;
void visit(int &i, int &j, vector<vector<bool>> &visited, vector<vector<int>> &matrix, int dir){
if(dir == 1){
for(; j<matrix[0].size(); j++){
if(visited[i][j] == false) {
res.push_back(matrix[i][j]);
visited[i][j] = true;
}else{
j--;
dir++;
i++;
if(i >= matrix.size() || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
if(j == matrix[0].size() - 1){
dir++;
i++;
if(i >= matrix.size() || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
}
}
else if(dir == 2){
for(; i<matrix.size(); i++){
if(visited[i][j] == false){
res.push_back(matrix[i][j]);
visited[i][j] = true;
}else{
i--;
dir++;
j--;
if(j < 0 || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
if(i == matrix.size() - 1){
dir++;
j--;
if(j < 0 || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
}
}
else if(dir == 3){
for(;j>=0; j--){
if(visited[i][j] == false) {
res.push_back(matrix[i][j]);
visited[i][j] = true;
}else{
j++;
i--;
dir++;
if(i < 0 || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
if(j == 0){
dir++;
i--;
if(i < 0 || visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
}
}
else if(dir == 4){
for(; i>=0; i--){
if(visited[i][j] == false){
res.push_back(matrix[i][j]);
visited[i][j] = true;
}else{
i++;
j++;
dir = 1;
if(visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
if(i == 0){
dir = 1;
j++;
if(visited[i][j] == true){
return;
}
visit(i, j, visited, matrix, dir);
break;
}
}
}
}
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<vector<bool>> visited(matrix.size(), vector<bool>(matrix[0].size(), false));
int dir[4] = {1, 2, 3, 4}; // i++, j++, i--, j--
int i, j;
i = j = 0;
visit(i, j, visited, matrix, 1);
return res;
}
};

官方的代码

简短精炼, 比我这种乱七八糟的好很多. 还用到了方向数组, 我记得方向数组, 但是忘记了他是二维的数组.

class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> order = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return order;
}
int rows = matrix.length, columns = matrix[0].length;
boolean[][] visited = new boolean[rows][columns];
int total = rows * columns;
int row = 0;
int column = 0;
int [][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
for(int i = 0; i<total; i++){
order.add(matrix[row][column]);
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if(nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]){
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
}

leetcode 54 螺旋数组的更多相关文章

  1. Java实现 LeetCode 54 螺旋矩阵

    54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...

  2. leetcode 54. 螺旋矩阵 及 59. 螺旋矩阵 II

    54. 螺旋矩阵 问题描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...

  3. LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵

    题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, ...

  4. [leetcode]54. Spiral Matrix2生成螺旋数组

    import java.util.Arrays; /** * Created by lvhao on 2017/7/6. * Given an integer n, generate a square ...

  5. LeetCode:螺旋矩阵【54】

    LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], ...

  6. 【LeetCode】54. 螺旋矩阵

    54. 螺旋矩阵 知识点:数组: 题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 输入:matrix = [[1,2,3],[4,5, ...

  7. leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  8. C#LeetCode刷题-数组

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

  9. LeetCode通关:数组十七连,真是不简单

    分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/chefyuan/algorithm-base       https://github.com/youngyangy ...

  10. PHP实现螺旋矩阵(螺旋数组)

    今天碰到一个比较有意思的问题, 就是把A到Y这25个字母以下面的形式输出出来 A B C D E P Q R S F O X Y T G N W V U H M L K J I 问题很有意思,就是转圈 ...

随机推荐

  1. centos firewall防火墙操作指令记录

    1. 查看防火墙状态 systemctl status firewalld.service 2. 关闭防火墙 systemctl stop firewalld.service 3. 开机自动关闭防火墙 ...

  2. AI浏览器自动化实战

    只需一句话,AI 即可自动操作浏览器: 搜索商品: 下单支付: 甚至还能进行深度研究(Deep Research),自动生成完整的攻略报告: Browser use 是一个开源项目,使 AI 大模型能 ...

  3. 使用Linux筛选文本-日志分析

    用于简单的文本筛选和日志分析还是很方便的. 我这里用的kali **目的:**筛选出test文件中 状态码为500的url 命令: cat test |grep '500' >test1 或 g ...

  4. JSP (二) -- JSP与HTML集成开发

    目录 脚本 普通脚本 声明脚本 输出脚本 JSP注释 语法规则 JSP指令 page指令 include指令 taglib指令 动作标签 include useBean setProperty get ...

  5. 【ROS】2.1 Turtlebot3汉堡Burger连接和远程控制

    机器人连接和远程控制 准备 充电 充电有两种方式: ①直接供电:电源适配器连接树莓派上的圆孔: ②电池供电:电源适配器插到蓝色的那个充电器,再将充电器与Burger底座的电池相连接.(当电池电量低于1 ...

  6. 【MOOC】华中科技大学计算机组成原理慕课答案-第四章-存储系统(二)

    待整理. 单选 1 32位处理器的最大虚拟地址空间为 A. 2G B. 8G C. 16G √D. 4G 2 在虚存.内存之间进行地址变换时,功能部件 ( )将地址从虚拟(逻辑)地址空间映射到物理地址 ...

  7. MySQL 8.0 修改密码 新建用的正确方式

    mysql 更新完密码,总是拒绝连接.登录失败?MySQL8.0 不能通过直接修改 mysql.user 表来更改密码.正确更改密码的方式备注: 清空root密码MySQL8.0 不能通过直接修改 m ...

  8. Flutter内嵌H5页面与前端通信:实现无缝交互的技术浅析

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  9. 内网服务器离线安装部署 Ollama

    一.安装 Ollama 1.官网下载地址:Releases · ollama/ollama 2.cd至下载目录 3.执行二进制文件安装 sudo tar -C /usr -xzf ollama-lin ...

  10. Spring AOP 面向切面编程之AOP是什么

    前言   软件工程有一个基本原则叫做"关注点分离"(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年头互联网也 ...