LeetCode之螺旋矩阵
问题
螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
分析
限定好前进方向以及边界,一个一个遍历下去即可,最近开始用Go,感觉很是不错,特意选了Go练习,AC code如下
···
func spiralOrder(matrix [][]int) []int {
var ret []int
ret = make([]int, 0)
n := len(matrix)
if n == 0 {
return ret
}
m := len(matrix[0])
//获取到了矩阵大小,
counter := 0 //记录处理个数
limu, limd, liml, limr := -1, n, -1, m
tmpx, tmpy := 0, 0
direction := 0 // 0 right 1 down 2 left7 3 up
for {
if counter == n*m {
return ret
}
ret = append(ret, matrix[tmpx][tmpy])
counter++
getNextIndex(&limu, &limd, &liml, &limr, &direction, &tmpx, &tmpy)
}
}
//获取下一个坐标,同时有可能更新方向、边界等
func getNextIndex(limu *int, limd *int, liml *int, limr *int, direction *int, x *int, y int) {
//fmt.Println(limu, *limd, *liml, *limr, *direction, *x, *y)
switch *direction {
case 0:
//to right
if *y+1 < *limr {
//正常更新
*y += 1
return
} else {
//到了右边界,需要更新方向以及边界,已经通过个数限定,所以改变方向后肯定可行
*limu += 1
*direction = 1
*x += 1
}
case 1:
//to down
if *x+1 < *limd {
//正常更新
*x += 1
return
} else {
//到了下边界,需要更新方向以及边界,
*limr -= 1
*direction = 2
*y -= 1
}
case 2:
//to right
if *y-1 > *liml {
//正常更新
*y -= 1
return
} else {
//到了左边界,需要更新方向以及边界,
*limd -= 1
*direction = 3
*x -= 1
}
case 3:
//to up
if *x-1 > *limu {
//正常更新
*x -= 1
return
} else {
//到了左边界,需要更新方向以及边界,已经通过个数限定,所以改变放下后肯定可行
*liml += 1
*direction = 0
*y += 1
}
}
}
···
其他
1.初次提交后由于空输入错了一次,应该更多的考虑特殊情况。
2.使用go的另一个好处就是可以很方便的进行测试,比如main.go中编写了解题函数,只需要一个公开的壳函数就能在mai_test.go中测试
···
func TspiralOrder(matrix [][]int) []int {
return spiralOrder(matrix)
}
···
而在测试中通过编写测试数据测试结果,可以方便的添加新的测试数据,同时能够避免改动导致原本能通过的数据failed。
···
func TestTspiralOrder(t *testing.T) {
var testData [][][]int
var tmpdata [][]int
var testReslut [][]int
var tmpanswer []int
tmpdata = [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}}
testData = append(testData, tmpdata)
tmpanswer = []int{1, 2, 3, 6, 9, 8, 7, 4, 5}
testReslut = append(testReslut, tmpanswer)
tmpdata = [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}}
testData = append(testData, tmpdata)
tmpanswer = []int{1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7}
testReslut = append(testReslut, tmpanswer)
tmpdata = make([][]int, 0)
testData = append(testData, tmpdata)
tmpanswer = make([]int, 0)
testReslut = append(testReslut, tmpanswer)
for i := 0; i != len(testData); i++ {
tmp := TspiralOrder(testData[i])
fmt.Println(tmp)
if IsTwoArraySame(tmp, testReslut[i]) == true {
fmt.Println("Pass")
} else {
fmt.Println("Failed")
}
}
}
···
LeetCode之螺旋矩阵的更多相关文章
- LeetCode:螺旋矩阵||【59】
LeetCode:螺旋矩阵||[59] 题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ...
- LeetCode:螺旋矩阵【54】
LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], ...
- LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7 ...
- Java实现 LeetCode 59 螺旋矩阵 II
59. 螺旋矩阵 II 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ...
- Java实现 LeetCode 54 螺旋矩阵
54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...
- leetcode 54. 螺旋矩阵 及 59. 螺旋矩阵 II
54. 螺旋矩阵 问题描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...
- [Leetcode]59.螺旋矩阵Ⅱ
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, ...
- LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵
题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, ...
- LeetCode 59. Spiral Matrix II (螺旋矩阵之二)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
随机推荐
- Jmeter 跨线程组传递参数 之两种方法
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- python进程之理论
********进程理论知识******** ****操作系统背景知识**** 顾名思义,进程及正在执行的一个过程,进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念, ...
- python进阶09 MySQL高级查询
python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...
- [LOJ 2070] 「SDOI2016」平凡的骰子
[LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出 ...
- hdu1494 跑跑卡丁车(动态规划)
Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高你的速度. ...
- Hive进阶_Hive的表连接
等值连接 select e.empno, d.deptno from emp e, dept d where e.deptno=d.deptno; 不等值连接 select e.empno, e.en ...
- Vue部分知识
一.本尊建议的学习顺序:https://zhuanlan.zhihu.com/p/23134551(侵删) 二.安装: 1.安装 Node.js,可以去Node.js的官网上下载: 2.(非必选)如果 ...
- Java常用函数式接口--Consumer接口andThen()方法使用案例(二)
Java常用函数式接口--Consumer接口使用案例
- 在IDEA中编辑struts国际化properties文件
在IDEA中编辑struts国际化properties文件 如果手工创建的web工程,struts的i18n属性文件,可以使用native2ascii工具转换(记得命令行的第二个文件名是要保存的文件名 ...
- swift 基础-4
函数:完成特定任务的代码块,通过名字来表示函数做什么 func 函数名(形参:形参类型)->返回类型 command +option+0 隐藏右边的框 //定义函数 func sayHello( ...