如何解决go中的螺旋矩阵问题

时间:2016-12-03 06:20:02

标签: go

https://leetcode.com/problems/spiral-matrix/ golang工具。 结果如下:

运行代码状态:运行时错误

运行代码结果:×

您的输入

[] 你的答案

预期答案

[] 显示差异

为什么[]是测试用例,它只是一维切片?

我的代码是:

func sprial(begin_r, begin_c, row, col int, matrix [][]int) []int {
s := make([]int, col*row, col*row+10)
k := 0
if row == 1 && col == 1 {
    s[k] = matrix[begin_r][begin_c]

    return s
} else if row == 1 {
    return matrix[begin_r][begin_c : col-1]
} else if col == 1 {
    return matrix[begin_r : row-1][begin_c]
} else {
    for i := begin_c; i < col; i++ {
        s[k] = matrix[begin_r][i]
        k++
    }
    for i := begin_r + 1; i < row; i++ {
        s[k] = matrix[i][col-1]
        k++
    }
    for i := col - 2; i >= begin_c; i-- {
        s[k] = matrix[row-1][i]
        k++
    }
    for i := row - 2; i >= begin_r+1; i-- {
        s[k] = matrix[i][begin_c]
        k++
    }

    return s[:k-1]
}
}

func spiralOrder(matrix [][]int) []int {
m := len(matrix)
n := len(matrix[0])
i := 0
j := 0
//  var rS []int
k := 0

//s1 := make([]int, m*n, m*n)

var s1 = []int{}
for {
    if m <= 0 || n <= 0 {
        break
    }
    s := sprial(i, j, m, n, matrix)
    if k == 0 {
        s1 = s

    } else {

        s1 = append(s1, s...)

    }

    i++
    j++
    m -= 2
    n -= 2
    k++
}
return s1
}

1 个答案:

答案 0 :(得分:1)

func spiralOrder(matrix [][]int) []int {
    if len(matrix) == 0 || len(matrix[0]) == 0 {
        return nil
    }

    m, n := len(matrix), len(matrix[0])

    next := nextFunc(m, n)

    res := make([]int, m*n)
    for i := range res {
        x, y := next()
        res[i] = matrix[x][y]
    }

    return res
}

func nextFunc(m, n int) func() (int, int) {
    top, down := 0, m-1
    left, right := 0, n-1
    x, y := 0, -1
    dx, dy := 0, 1
    return func() (int, int) {
        x += dx
        y += dy
        switch { 
        case y+dy > right:
            top++
            dx, dy = 1, 0
        case x+dx > down:
            right--
            dx, dy = 0, -1
        case y+dy < left:
            down--
            dx, dy = -1, 0
        case x+dx < top:
            left++
            dx, dy = 0, 1
        }
        return x, y
    }
}

来源:https://github.com/aQuaYi/LeetCode-in-Go/blob/master/Algorithms/0054.spiral-matrix/spiral-matrix.go

此存储库以非常理想的方式为LeetCode问题提供了大多数解决方案。请看看。希望对您有所帮助。