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,一个口诀教会你旋转二维数组相关推荐

  1. 北师大版图形的旋转二教案_北师大版数学六年级下册《图形的旋转(二)》教案疲惫不堪的意思...

    秋天的手抄报-地税局实习报告2020年10月6日发(作者:元载) 图形的旋转(二) 教材分析 <图形的旋转(二)>是义务教育课程标准实验 教科书(北师大版)六年级(下册)第 三单元第30页 ...

  2. 北师大版图形的旋转二教案_六年级数学下册《图形的旋转(二)》教学设计北师大版...

    年 级 六 学科 数学 课型 讲授课 设计时间 总课时 2 授课 时间 学习内容 图形的旋转(一) 学习目标 1. 能在观察图片资料和旋转实验中得出数学结论,初步从奇妙的图形中体会所隐 含的数学道理. ...

  3. Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所

    **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府. ...

  4. 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的

    <c primer pius>第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处 ...

  5. go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历

    引入 [1]练习引入: package main import "fmt" func main(){//实现的功能:给出五个学生的成绩,求出成绩的总和,平均数://给出五个学生的成 ...

  6. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  7. python二维向量运算模拟_【转载 Python】Numpy基础:数组和矢量运算

    Numpy基础:数组和矢量运算 目录: 尊重原创,转载出处:https://blog.csdn.net/sunyaowu315/article/details/82733249?utm_medium= ...

  8. python 螺旋数组_LeetCode54,螺旋矩阵,一题学会一个重要技巧

    今天是LeetCode专题的第32篇文章,我们一起看的是LeetCode的第54题--Spiral Matrix. 首先解释一下题意,这个Spiral是螺旋的意思,据说英文版的漫画里,把鸣人的螺旋丸就 ...

  9. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

最新文章

  1. 《树莓派Python编程指南》——2.3 小结
  2. PHP - .htaccess设置显示PHP错误 (转)
  3. python入门代码示例-Python入门100个实例(14)——换行符和制表符
  4. Hadoop-2.7.4 八节点分布式集群安装
  5. 友盟小米收不到推送消息_App消息推送的到达率多少才是正常的?
  6. view技术简单了解
  7. javascript简单介绍
  8. asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
  9. 【转】使用websocket-sharp来创建c#版本的websocket服务
  10. KMP算法总结+Next数组+Nextval数组
  11. frame页面跳转和信息提示页面
  12. 信息的哲学--从信息到数据存储,再到数据保护
  13. 如何修改hosts文件
  14. sql语句下的同比,环比操作
  15. 台式计算机速度变慢的原因,电脑运行速度变慢的原因和解决方法
  16. JavaScript 常用事件大全
  17. 网点分布图如何制作,如何制作网点地图
  18. css波浪动画使用图片
  19. 社会工程学与APT攻击之——社工防御方法
  20. 【Flutter实战】六大布局组件及半圆菜单案例

热门文章

  1. 通用职责分配软件原则之8-中介原则
  2. 《go程序设计语言》读书笔记
  3. firstchild.data与childNodes[0].nodeValue意思
  4. mysql视图实验心得_Mysql学习经验总结【3】
  5. php weize_docs.html
  6. C语言:学生信息管理程序
  7. 源码分析参考:Scheduler
  8. python中多进程及进程间通信的方法
  9. 浅说深度学习(4):增强学习
  10. C++ C# 中作用域限定符