描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]

则依次打印出数字

[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

数据范围:

0 <= matrix.length <= 100

0 <= matrix[i].length <= 100

示例
// 输入:
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
// 返回值:
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

// 输入:
[[1,2,3,1],[4,5,6,1],[4,5,6,1]]
// 返回值:
[1,2,3,1,1,1,6,5,4,4,5,6]
解题思路
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]

设左边界、右边界、上边界、下边界分别为 left、right、up、down
则:left=0、right=4=matrix[0].length-1、up=0、down=matrix.length-1
1.上边界先从左到右遍历,遍历后上边界下移(up++)
2.右边界从上往下遍历,遍历后右边界左移(right--)
3.下边界从右往左遍历,遍历后下边界上移(down--)
4.左边界从下往上遍历,遍历后左边界右移(left++)
一直重复 1-4,最后遍历完成即可
代码实现
/**
 * 边界模拟法
 *
 * @param matrix int 整型二维数组
 * @return int 整型一维数组
 */
func printMatrix(matrix [][]int) []int {
    result := []int{}
    n := len(matrix)
    if 0 == n {
        return result
    }

    // 左、右、上、下 边界
    left, right, up, down := 0, len(matrix[0])-1, 0, n-1
    for left <= right && up <= down {
        // 遍历上边界从左到右
        for i := left; i <= right; i++ {
            result = append(result, matrix[up][i])
        }
        // 上边界向下
        up++
        if up > down {
            break
        }

        // 右边界的从上到下
        for i := up; i <= down; i++ {
            result = append(result, matrix[i][right])
        }
        //右边界向左
        right--
        if left > right {
            break
        }

        // 下边界的从右到左
        for i := right; i >= left; i-- {
            result = append(result, matrix[down][i])
        }
        // 下边界向上
        down--
        if up > down {
            break
        }

        // 左边界从下向上
        for i := down; i >= up; i-- {
            result = append(result, matrix[i][left])
        }
        // 左边界向右
        left++
        if left > right {
            break
        }
    }

    return result
}

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论