当前位置: 首页 > news >正文

算法leetcode|54. 螺旋矩阵(rust重拳出击)


文章目录

  • 54. 螺旋矩阵:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:
      • 每次循环移动一步:
      • 每次循环完成一个顺时针:


54. 螺旋矩阵:

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

样例 1:

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

样例 2:

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

分析:

  • 面对这道算法题目,二当家的陷入了沉思。
  • 可以每次循环移动一步,判断移到边界就变换方向。
  • 也可以每次循环都换完4次方向,也就是完成一次顺时针,然后缩圈。

题解:

rust:

impl Solution {pub fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {let mut ans = Vec::new();let (rows, columns) = (matrix.len(), matrix[0].len());let (mut left, mut right, mut top, mut bottom) = (0, columns - 1, 0, rows - 1);while left <= right && top <= bottom {(left..right + 1).for_each(|column| {ans.push(matrix[top][column]);});(top + 1..bottom + 1).for_each(|row| {ans.push(matrix[row][right]);});if left < right && top < bottom {(left..right).rev().for_each(|column| {ans.push(matrix[bottom][column]);});(top + 1..bottom).rev().for_each(|row| {ans.push(matrix[row][left]);});}if right == 0 || bottom == 0 {break;}left += 1;right -= 1;top += 1;bottom -= 1;}return ans;}
}

go:

func spiralOrder(matrix [][]int) []int {rows, columns := len(matrix), len(matrix[0])left, right, top, bottom := 0, columns-1, 0, rows-1ans := make([]int, rows*columns)index := 0for left <= right && top <= bottom {for column := left; column <= right; column++ {ans[index] = matrix[top][column]index++}for row := top + 1; row <= bottom; row++ {ans[index] = matrix[row][right]index++}if left < right && top < bottom {for column := right - 1; column >= left; column-- {ans[index] = matrix[bottom][column]index++}for row := bottom - 1; row > top; row-- {ans[index] = matrix[row][left]index++}}left++right--top++bottom--}return ans
}

c++:

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int rows = matrix.size(), columns = matrix[0].size();int left = 0, right = columns - 1, top = 0, bottom = rows - 1;while (left <= right && top <= bottom) {for (int column = left; column <= right; ++column) {ans.emplace_back(matrix[top][column]);}for (int row = top + 1; row <= bottom; ++row) {ans.emplace_back(matrix[row][right]);}if (left < right && top < bottom) {for (int column = right - 1; column >= left; --column) {ans.emplace_back(matrix[bottom][column]);}for (int row = bottom - 1; row > top; --row) {ans.emplace_back(matrix[row][left]);}}++left;--right;++top;--bottom;}return ans;}
};

python:

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:ans = list()rows, columns = len(matrix), len(matrix[0])left, right, top, bottom = 0, columns - 1, 0, rows - 1while left <= right and top <= bottom:for column in range(left, right + 1):ans.append(matrix[top][column])for row in range(top + 1, bottom + 1):ans.append(matrix[row][right])if left < right and top < bottom:for column in range(right - 1, left - 1, -1):ans.append(matrix[bottom][column])for row in range(bottom - 1, top, -1):ans.append(matrix[row][left])left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1return ans

java:

每次循环移动一步:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> ans = new ArrayList<Integer>();final int     rows             = matrix.length, columns = matrix[0].length;int           left             = 0, right = columns - 1, top = 0, bottom = rows - 1;final int     total            = rows * columns;int           row              = 0, column = 0;final int[][] moveDirections   = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};final int[][] borderDirections = {{1, 0, 0, 0}, {0, 0, 1, 0}, {0, -1, 0, 0}, {0, 0, 0, -1}};int           directionIndex   = 0;for (int i = 0; i < total; i++) {ans.add(matrix[row][column]);int nextRow = row + moveDirections[directionIndex][0], nextColumn = column + moveDirections[directionIndex][1];if (nextRow < top || nextRow > bottom || nextColumn < left || nextColumn > right) {// 变换方向directionIndex = (directionIndex + 1) % 4;// 修改边界left += borderDirections[directionIndex][0];right += borderDirections[directionIndex][1];top += borderDirections[directionIndex][2];bottom += borderDirections[directionIndex][3];}row += moveDirections[directionIndex][0];column += moveDirections[directionIndex][1];}return ans;}
}

每次循环完成一个顺时针:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> ans = new ArrayList<Integer>();final int rows = matrix.length, columns = matrix[0].length;int       left = 0, right = columns - 1, top = 0, bottom = rows - 1;while (left <= right && top <= bottom) {for (int column = left; column <= right; ++column) {ans.add(matrix[top][column]);}for (int row = top + 1; row <= bottom; ++row) {ans.add(matrix[row][right]);}if (left < right && top < bottom) {for (int column = right - 1; column >= left; --column) {ans.add(matrix[bottom][column]);}for (int row = bottom - 1; row > top; --row) {ans.add(matrix[row][left]);}}++left;--right;++top;--bottom;}return ans;}
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


相关文章:

算法leetcode|54. 螺旋矩阵(rust重拳出击)

文章目录 54. 螺旋矩阵&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a;每次循环移动一步&#xff1a;每次循环完成一个顺时针&#xff1a…...

单容水箱建模(自衡单容水箱+无自衡单容水箱)

自衡单容水箱Simulink建模和PLC源代码请参看下面文章链接: 单容双容水箱建模(simulink仿真+PLC代码)_RXXW_Dor的博客-CSDN博客PLC通过伯努利方程近似计算水箱流量详细内容请参看下面的文章博客PLC通过伯努利方程近似计算水箱流量(FC)_怎么用伯努利方程求某水位流量_RXXW_Dor的…...

分享Python7个爬虫小案例(附源码)

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点&#xff0c;非常适合刚入门python爬虫的小伙伴参考学习。注&#xff1a;若涉及到版权或隐私问题&#xff0c;请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…...

我用ChatGPT写2023高考语文作文(一):全国甲卷

2023年 全国甲卷 适用地区&#xff1a;广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间&#xff0c;但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考&#xff1f;请写一篇文章。 要求&#xff1a;选准角度&#xff0c;确定立意&#xff0c;明确文体&am…...

c++ modbusTCP

//Modbus TCP是一种基于TCP/IP协议的Modbus协议&#xff0c;它允许Modbus协议通过以太网进行通信。 //在C中&#xff0c;可以使用第三方库来实现Modbus TCP通信&#xff0c;例如libmodbus和QModbus。 //使用libmodbus库实现Modbus TCP通信的示例代码如下&#xff1a; //c #incl…...

linux(信号结尾)

目录&#xff1a; 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…...

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽&#xff0c;有些二五仔习惯搞点自研的安全扫描工具&#xff0c;然后加点DIY元素&#xff0c;他也不管扫的准不准&#xff0c;就要给你报个高中危的漏洞&#xff0c;然后就要去修复&…...

在linux 上安装 NFS服务器软件

在 Ubuntu Linux 中创建 NFS 文件系统通常需要完成以下步骤: 安装 NFS 服务器软件。您可以在终端上使用以下命令来安装所需的软件包。sudo apt-get update sudo apt-get install nfs-kernel-server创建要共享的目录。例如,您可以创建一个名为 /var/nfs/shared 的目录。sudo m…...

网卡中的Ring buffer -- 解决 rx_resource_errors 丢包

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 网卡在高速收包的过程中&#xff0c;出现 rx error , 细查是 rx_resource_errors 如下&#xff1a; rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…...

六月九号补题日记:Codeforces Round 877 (Div. 2)

专注是不够的&#xff0c;很重要的一方面在于细节&#xff0c;关注细节&#xff1a;精细和专注才是成功的重点&#xff01;&#xff01;&#xff01; A 题意&#xff1a;给你一堆数字&#xff0c;说这一堆数字是由最初的两个数字相减得到的&#xff0c;让你求出两个数字其中一…...

python基础选择题,高中适用

1. 下面哪个是 Python 的注释符号&#xff1f; A. // B. # C. /* D. ; 答案&#xff1a;B 2. 下面哪个是 Python 的赋值运算符&#xff1f; A. B. C. ! D. > 答案&#xff1a;A 3. 下面哪个是 Python 的逻辑运算符&#xff1f; A. && B. || C. ! D. & 答…...

Linux 面试题-(腾讯,百度,美团,滴滴)

Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志t.log(访问量)&#xff0c;将各个ip 地址截取&#xff0c;并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.20…...

DDD--战略设计步骤

在领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;中&#xff0c;战略设计是指在系统的整体层面上考虑领域模型的组织和架构。下面是一些战略设计的详细步骤&#xff1a; 确定限界上下文&#xff08;Bounded Context&#xff09;&#xff1a;首先&a…...

Web Scoket简述

Web Socket 简介 初次接触 Web Socket 的人&#xff0c;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f; 因为 HTTP 协议有一个缺陷&#xff1a;通信只能由客户端发起。http基于请求响应实现。 &#xff08;准确来说HTTP…...

“Docker 技术在企业中的应用及挑战解决方案“

Docker 技术是一种基于容器化的应用部署和管理技术。随着云计算的普及和应用的不断增多&#xff0c;Docker 技术在企业中的应用越来越广泛。本文将介绍 Docker 技术的基本概念、优势和应用场景&#xff0c;并讨论如何在企业中应用 Docker 技术。 一、Docker 技术概述 Docker …...

vue中开发包、生产包、全局包的区别以及安装语法

目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包&#xff1a;开发包 (Development build)&#xff0c;生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…...

list的模拟实现

前言 list是STL中重要的容器&#xff0c;了解它的原理对于我们掌握它是有很多的帮助的&#xff0c;一般list和vector都是一起来使用的&#xff0c;因为它们的优缺点不同&#xff0c;刚好可以互补。list的优点是任意位置的插入和删除都很快&#xff0c;它的缺点是不支持随机访问…...

ChatGLM简介和SSE聊天接口测试效果

开发公司 智谱AI是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型GLM-130B&#xff0c;并构建了高精度通用知识图谱&#xff0c;形成数据与知识双轮驱动的认知引擎&#xff0c;基于此模型…...

darknet yolo标注、训练详细说明

文章目录 1、标注数据1.1、标注1.2、生成训练列表文件train.txt1.3、转换数据标注格式 2、训练数据整理2.1、修改train.txt路径2.2、修改yolov3.cfg2.3、obj.name和obj.data2.4、训练脚本文件trian.sh2.5、测试脚本文件test.sh 3、训练 本文对应的脚本文件和程序下载链接 darke…...

chatgpt赋能python:Python如何产生随机整数?

Python如何产生随机整数&#xff1f; Python是一种高级编程语言。它允许程序员轻松地创建各种类型的应用程序&#xff0c;包括生成随机整数。本文将介绍如何在Python中使用内置的随机数函数来生成随机整数。 random模块 Python中的random模块提供了生成随机数的函数。这些函…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...