描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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
}
还不快抢沙发