LeetCode之螺旋矩阵

Posted youdias

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Spiral Matrix II 螺旋矩阵之二

LeetCode:螺旋矩阵||59

Leetcode 54.螺旋矩阵

Leetcode 54.螺旋矩阵

Leetcode 54.螺旋矩阵

Leetcode 54.螺旋矩阵