怎么输出一个二维数组_LeetCode54与59,一个口诀教会你旋转二维数组
Halo, 好久不见各位小伙伴,这几天工作是在是太忙了,忙到都没有足够的时间去继续写算法题目,那么今天一次性带来两道比较类似的题目,在LeetCode中属于中等难度的题目。但其实只要你掌握其中的要点,这一题其实跟简单的一样
那么今天带来的就是第54题,和59题。两题都涉及到旋转二维数组的概念。这两题分别是在说给定一个二维数组,按照螺旋的方式输出数字,以及按照螺旋的方式填充元素。其实都在描述的是同一个概念的东西
在LeetCode中同类型的题目,通常主要的「中心思想不变」只变其中参数偏多,这一题就把这个中心思想解释得淋漓尽致了。
我们要做旋转题目,我们必须要懂一个非常简单的概念,那么就是「上」、「下」、「左」、「右」的四个方向,没错就是这简单的四个方向,如果你没有很明确的思路的话,你会走不下去的。
接下来,我们先看一下图
这个图中的二维数组很简单,但是要你螺旋输出他,也就是「右->下->左->上」的顺序不断的重复这个步骤,但是我们要十分注重边界,因为每一次循环其实是一个边界的移动。
比方说,我们第一回合从第一行开始输出「1、2、3」 结束这3个输出以后,我们必须把「上边界」 往下挪动一行,因为当下一次循环到此处时,必须是「这一行」的「下一行」, 在这里没理解的小伙伴,我再举个例子从二维数组的右侧输出「3、6、9」此时的顺序是往下输出,但输出完后,「右边界」 必须往左挪动一行。
其实这个是有个口诀的「右移上加」、「下移右减」、「左移下减」、「上移左加」 记住这4个口诀以后,再来参考我们的code,先来看「题目54」
func spiralOrder(matrix [][]int) []int {res := []int{}if len(matrix) == 0{return res}top := 0right := len(matrix[0])-1bottom := len(matrix) - 1left := 0direction := "right"for left<=right && top <= bottom{switch direction {case "right":for r:=left; r<=right; r++{res = append(res, matrix[top][r])}top ++ //做完后 整个跳到下一行direction = "bottom"breakcase "bottom":for b:= top; b<=bottom; b++{res = append(res, matrix[b][right])}right -- //做完后 整个右边往左靠一行direction = "left"breakcase "left":for l:= right; l>=left; l--{res = append(res, matrix[bottom][l])}bottom -- //做完后 整个下面往上一行direction = "top"breakcase "top":for t:= bottom; t>=top; t--{res = append(res, matrix[t][left])}left ++ //做完后 整个左边往右一行direction = "right"break}}return res
}
这里为什么「left<=right 和 top<= bottom」 就是因为刚才所说的边界问题,如果说这里不<=的话,那么每一次循环就有其中一行的数据,我们是获取不到的了。
有了这个基础以后,你再来看「题目59」, 就什么事情都迎面而解了。
func generateMatrix(n int) [][]int {res := make([][]int, n)if n == 1{tmp := []int{1}res[0] = tmpreturn res}if n > 1{for a := range res{res[a] = make([]int, n) //初始化二维数组}}top := 0right := n - 1bottom := n - 1left := 0direction := "right"count := 1for left <= right && top <= bottom {switch direction {case "right":for r := left; r <= right; r++ {res[top][r] = countcount++}top++ //做完后 整个跳到下一行direction = "bottom"breakcase "bottom":for b := top; b <= bottom; b++ {res[b][right] = countcount++}right-- //做完后 整个右边往左靠一行direction = "left"breakcase "left":for l := right; l >= left; l-- {res[bottom][l] = countcount++}bottom -- //做完后 整个下面往上一行direction = "top"breakcase "top":for t:= bottom; t>=top; t--{res[t][left] = countcount++}left ++ //做完后 整个左边往右一行direction = "right"break}}return res
}
第59题目,就是初始化一个二维数组为「n的长度」然后往里面添加一个「count」然后,就没然后了,这两题非常简单。我会把我做的所有题目的代码都放在Github上哦,希望小伙伴们可以去点个star
Github代码合集(持续更新...)
怎么输出一个二维数组_LeetCode54与59,一个口诀教会你旋转二维数组相关推荐
- 北师大版图形的旋转二教案_北师大版数学六年级下册《图形的旋转(二)》教案疲惫不堪的意思...
秋天的手抄报-地税局实习报告2020年10月6日发(作者:元载) 图形的旋转(二) 教材分析 <图形的旋转(二)>是义务教育课程标准实验 教科书(北师大版)六年级(下册)第 三单元第30页 ...
- 北师大版图形的旋转二教案_六年级数学下册《图形的旋转(二)》教学设计北师大版...
年 级 六 学科 数学 课型 讲授课 设计时间 总课时 2 授课 时间 学习内容 图形的旋转(一) 学习目标 1. 能在观察图片资料和旋转实验中得出数学结论,初步从奇妙的图形中体会所隐 含的数学道理. ...
- Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所
**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府. ...
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
<c primer pius>第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处 ...
- go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历
引入 [1]练习引入: package main import "fmt" func main(){//实现的功能:给出五个学生的成绩,求出成绩的总和,平均数://给出五个学生的成 ...
- C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇
序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...
- python二维向量运算模拟_【转载 Python】Numpy基础:数组和矢量运算
Numpy基础:数组和矢量运算 目录: 尊重原创,转载出处:https://blog.csdn.net/sunyaowu315/article/details/82733249?utm_medium= ...
- python 螺旋数组_LeetCode54,螺旋矩阵,一题学会一个重要技巧
今天是LeetCode专题的第32篇文章,我们一起看的是LeetCode的第54题--Spiral Matrix. 首先解释一下题意,这个Spiral是螺旋的意思,据说英文版的漫画里,把鸣人的螺旋丸就 ...
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
最新文章
- 《树莓派Python编程指南》——2.3 小结
- PHP - .htaccess设置显示PHP错误 (转)
- python入门代码示例-Python入门100个实例(14)——换行符和制表符
- Hadoop-2.7.4 八节点分布式集群安装
- 友盟小米收不到推送消息_App消息推送的到达率多少才是正常的?
- view技术简单了解
- javascript简单介绍
- asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
- 【转】使用websocket-sharp来创建c#版本的websocket服务
- KMP算法总结+Next数组+Nextval数组
- frame页面跳转和信息提示页面
- 信息的哲学--从信息到数据存储,再到数据保护
- 如何修改hosts文件
- sql语句下的同比,环比操作
- 台式计算机速度变慢的原因,电脑运行速度变慢的原因和解决方法
- JavaScript 常用事件大全
- 网点分布图如何制作,如何制作网点地图
- css波浪动画使用图片
- 社会工程学与APT攻击之——社工防御方法
- 【Flutter实战】六大布局组件及半圆菜单案例