1.1. 题目

1.1.1. 螺旋矩阵 II

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]



1.1.2. 题解:

  • 数组螺旋旋转.. 顺时针
  • 我找了半天规律.. 还是笨办法好使

1.1.3. 思路:

  • 规律不好找,那就笨方法来找规律!

  • 假设第一圈(假设n=9)

    • 长度是9,下标从0~8,把第一个值为s=1,每走一个+1,遍历到8结束,下标是 arr[0][i]
    • 高度是8(因为上一步已经算了),下标从1~8,每走一个还是+1,遍历到8结束 下标是 arr[i][8]
    • 长度是8(因为上一步已经算了),下标从7~0,每走一个还是+1,遍历到0结束,下标是 arr[8][i]
    • 高度是8(因为上一步已经算了),下标从7~1,每走一个还是+1,遍历到1结束, 下标是 arr[i][0]
  • 假设第二圈(假设n=9)

    • 同上算
  • 写笨代码

    //matrix 是二维数组

    width := len(matrix[0])
    height := len(matrix)

    for i:=0;i<width;i++ {
        fmt.Println(matrix[0][i],"横向1")
    }
    for i:=1;i<height;i++ {
        fmt.Println(matrix[i][width-1],"纵向1")
    }
    for i:=width-2;i>=0;i-- {
        fmt.Println(matrix[width-1][i],"横向2")
    }
    for i:=width-2;i>0;i-- {
        fmt.Println(matrix[i][0],"纵向2")
    }

    width2 := 8
    height2 := 8

    for i:=1;i<width2;i++ {
        fmt.Println(matrix[1][i],"横向1")
    }
    for i:=2;i<height2;i++ {
        fmt.Println(matrix[i][width2-1],"纵向1")
    }
    for i:=width2-2;i>=1;i-- {
        fmt.Println(matrix[width2-1][i],"横向2")
    }
    for i:=width2-2;i>1;i-- {
        fmt.Println(matrix[i][1],"纵向2")
    }

    width3 := 7
    height3 := 7

    for i:=2;i<width3;i++ {
        fmt.Println(matrix[2][i],"横向1")
    }
    for i:=3;i<height3;i++ {
        fmt.Println(matrix[i][width3-1],"纵向1")
    }
    for i:=width3-2;i>=2;i-- {
        fmt.Println(matrix[width3-1][i],"横向2")
    }
    for i:=width3-2;i>2;i-- {
        fmt.Println(matrix[i][2],"纵向2")
    }
  • 思路就是,先定一个二维数组,初始值都是0
  • 然后按照条件,顺时针循环,总共 (n >> 1) + 1
  • 循环的下标于 层数有关!

1.1.4. 代码:

点击显示
func generateMatrix(n int) [][]int {
    arr := make([][]int,n)
    for i:=0;i<n;i++ {
        arrH := make([]int,n)
        arr[i] = arrH
    }
    var s int
    s = 1
    for l:=0;l< n>>1 + 1;l++ {
        width := n-l
        height := n-l

        for i:=0+l;i<width;i++ {
            arr[0+l][i] = s
            s++
        }
        for i:=1+l;i<height;i++ {
            arr[i][width-1] = s
            s++
        }
        for i:=width-2;i>=0+l;i-- {
            arr[width-1][i] = s
            s++
        }
        for i:=width-2;i>0+l;i-- {
            arr[i][l]= s
            s++
        }
    }

    return arr
}

代码

results matching ""

    No results matching ""