Elixir求解螺旋矩阵问题

news2024/9/28 0:19:58

题目是构造一个 n 维的顺时针螺旋矩阵,那么什么是螺旋矩阵呢?就是从左上角开始按顺时针方向从外向内依次递增的二维矩阵。一个3维螺旋矩阵示例如下:
在这里插入图片描述

我们是在 elixir 中求解,没有变量,没有循环,但是我们有递归。首先我们要先确定可重复的计算是什么,以 3x3 的螺旋矩阵为例,我们沿着顺时针方向用不同颜色标注出每次递归的内容,如下图所示。

在这里插入图片描述
首先我们把矩阵分成第一行和剩余部分,第一行很好生成,就是一个长度为 n 的递增数组,如果递归能构造出剩余部分,那么问题就解决了。可问题是这个规律能成立吗?这么看不太好看,不妨每次拆分后把矩阵逆时针旋转90度。
在这里插入图片描述
将矩阵旋转之后,我们发现的确是可以将它拆分成递增的第一行和剩余部分。不过先别急,我们还有一个问题需要解决。第一行很好构建,剩余部分来自下一次递归调用,但是它的结果我们却不能直接使用。

观察上图中的第3和第4幅图,它们分别是第3次和第4次迭代的状态。第3次迭代中,我们需要构造的第一行是 [6,7] ,剩余部分来自第4次迭代。我们期望的是 [9, 8] ,但是实际第4次迭代的结果是 [[8], [9]]

这不完了吗?但是先别急,矩阵是可以变换的。矩阵[[8], [9]] 先反转,再转置结果就是 [9, 8] 了,这样看不太明显,我们以第3次迭代结果为例看下转换过程。
在这里插入图片描述
不得不说,秒,实在是秒!

# 生成旋转矩阵
def matrix(0), do: []
def matrix(dimension), do: do_matrix(dimension, dimension, 1)

defp do_matrix(_, 0, _), do: [[]]
defp do_matrix(rows, cols, min) do
  top_row = Enum.to_list(min .. (min + cols - 1))
  other_rows = do_matrix(cols, rows - 1, min + cols) |> rotate_right
  [top_row | other_rows]
end

defp rotate_right(rows), do: rows |> Enum.reverse |> transpose

# 矩阵转置
defp transpose(rows), do: rows |> Enum.zip |> Enum.map(&Tuple.to_list/1)

在 elixir 中,矩阵转置也很秒,优雅,实在是优雅。

另一种递归思路是拆分成中心和外圈,如下图:
在这里插入图片描述
虽然这样磕磕绊绊也能将矩阵构造出来,但是没有第一种方式优雅,所以就不贴代码了。

说到这里,leetcode上也有一道类似的题目,但它是反过来,按顺时针方向螺旋输出矩阵,这不是巧了嘛这不,通过反转和转置,我们只需要每次将矩阵的第一行拼接到结果数组中就行了。贴下代码:

defmodule Solution do
  @spec spiral_order(matrix :: [[integer]]) :: [integer]
  def spiral_order([]), do: []
  def spiral_order([h|t]) do
    tail = t |> transpose |> Enum.reverse |> spiral_order
    Enum.concat(h, tail)
  end
  defp transpose(rows), do: rows |> Enum.zip() |> Enum.map(&Tuple.to_list/1)
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2171617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国篆刻—孙溟㠭浅析碑帖《张黑女墓志》

中国篆刻——孙溟㠭浅析碑帖《张黑女墓志》 《张黑女墓志》 《张黑女墓志》全称是《魏南阳张玄墓志》,又称《张玄墓志》,是北魏时期的墓志,属正书体,北魏普泰元年(公元531年)立碑。原碑已经丢失&#xf…

5个最佳开源RPA框架之一UI.Vision介绍

博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。技术范围: 目前专注java体系,以及golang、.Net、…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法

本文学习于TI 高精度实验室课程,介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…

产品需求-聊天框中发送的文件,要求文件名过长是保留后缀名省略中间的文字部分

介绍一下之前做过的一个需求,是要实现pc的一个聊天软件的消息引用功能。对于文件的引用,产品是这样做要求的: 消息框无固定长度,根据回复的文字长度决定消息框长度对于一个pc项目,当页面窗口变化时要实现响应式文件名…

个人账号(学校+个人)申请专利过程中遇见的问题

一、请指定一位申请人作为代表人 因为是拿个人账号申请的专利,同时要求学校是第一申请人,所以可以再添加一个第二申请人,然后勾选第二申请人为代表人就可以提交申请了(注意:两个申请人只能减免75%,也就是要…

Kubernetes配置管理(kubernetes)

实验环境: 在所有节点上拉取镜像;然后把资源清单拉取到第一个master节点上; 同步会话,导入镜像: configmap/secret 配置文件的映射 变量: 基于valuefrom的方式 cm--》pod 特点:变量的名称可…

109.游戏安全项目:信息显示二-利用游戏通知辅助计算基址

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信…

C++之二叉搜索

1.二叉搜索树的概念 二叉搜索树又称为二叉排序树,它有以下的特点。 1.如果它的左子树不为空,则左子树上所以结点的值都小于等于根结点的值 2.如果它的右子树不为空,则右子树上所有结点都大于等于根结点的值 3.它的左右子树也分别为二叉搜…

Lab1:虚拟机kolla安装部署openstack,并创建实例

实验内容: 创建并配置虚拟机安装OpenStack创建镜像创建实例类型选择网络配置创建实例 1、选择一个适合你的系统的虚拟机管理软件: VirtualBox (推荐) VMWare 其他 2、下载 .iso 镜像文件 openstack S 版本 iso 链接&#xff1…

Llama系列迈向多模态新时代:3.2版本开源超越闭源,并携手Arm推出手机优化版

在多模态领域,开源模型也超闭源了! 就在刚刚结束的 Meta 开发者大会上,Llama 3.2 闪亮登场: 这回不仅具备了多模态能力,还和 Arm 等联手,推出了专门为高通和联发科硬件优化的 “移动” 版本。 具体来说&a…

jmeter压测常见报错总结

address already in use:connect 报错原因: 1、windows系统为了保护本机,限制了其他机器到本机的连接数. 2、TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期&#xff08…

javaJUC基础

JUC基础知识 多线程 管程 Monitor,也就是平时所说的锁。Monitor其实是一种同步机制,它的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码块,JVM中同步是基于进入和退出监视器(Monitor管程对…

【MySQL】数据库表的基本查询——增删查改

W...Y的主页 😊 代码仓库分享💕 目录 表的增删改查 Create 单行数据 全列插入 多行数据 指定列插入 插入否则更新 替换 Retrieve SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 WHERE 条件 结果排序 筛选…

ETLCloud携手ClickHouse:高效的数据查询效率

自从大数据处理技术走进大众视野、开源项目Hadoop的出现,以前受制于数据库处理能力的大数据技术蓬勃发展,传统关系型数据库所构建的数据仓库,被以Hive为代表的大数据技术所取代,随着技术不断发展,Hadoop虽然带来了诸多…

Harbor的安装与使用

任务分析 一、规划节点 IP地址 主机名 节点 192.168.20.20 master 容器master节点 192.168.20.21 node 容器worker节点 二、基础准备 镜像使用CentOS7.9(主机配置自定义,推荐配置4vCPU/12G内存/100G硬盘),使用这两台云…

韦东山FreeRTOS笔记

介绍 这篇文章是我学习FreeRTOS的笔记 学的是哔哩哔哩韦东山老师的课程 在学习FreeRTOS之前已经学习过江协的标准库和一丢丢的超子说物联网的HAL了。他们讲的都很不错 正在更新, 大家可以在我的Gitee仓库中下载笔记源文件、项目资料等 笔记源文件可以在Notion…

鸿蒙OS开发之动画相关示例分享, 关于弹出倒计时动画的实战案例源码分享

基础动画案例 Entry Component struct Index {StatebtnWidth:number 200 // 按钮的宽度StatebtnHeight:number 100 // 按钮的高度build() {Row(){Column(){Button("测试").width(this.btnWidth).height(this.btnHeight)// 按钮: 用来启动动画Button("动画开始…

USB2.0主机设备检测过程以及信号分析

一,USB协议发展 USB接口自1994年推出以来,经过30年的发展,从USB1.0发展到了现在的USB4.0,传输速率也从最开始的1.5Mbps,大幅提高到了最新的40Gbps。 USB协议按照速度等级和连接方式分可分为7个版本,但是从…

docker -私有镜像仓库 - harbor安装

文章目录 1、镜像仓库简介2、Harbor简介3、下载与安装3.1、下载3.2、安装3.2.1、上传harbor-offline-installer-v2.8.2.tgz到虚拟机中解压并修改配置文件3.2.2、解压tgz包3.2.3、切换到解压缩后的目录下3.2.4、准备配置文件3.2.5、修改配置文件 4、启动Harbor5、启动关闭命令6、…

为什么这款智能在线派单软件成为行业首选?

智能在线派单软件通过自动化任务分配等提升效率,ZohoDesk因其全方位服务管理、智能分配、定制性强、数据分析等功能,成为企业优选。实例涵盖物流、家政、维修、医疗等行业,提高效率和客户满意度。 一、智能在线派单软件有什么功能 在深入探讨…