package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param matrix int整型二维数组
* @return int整型一维数组
*/
func printMatrix( matrix [][]int ) []int {
// write code here
// 特殊条件排除
if len(matrix) == 0 {
return nil
}
m, n := len(matrix), len(matrix[0])
ans := make([]int, m * n)
// 结果切片起始索引
index := 0
// 利用边界收缩
left, right, up, down := 0, n-1, 0, m-1
for left <= right && up <= down {
// 从左往右打印
for i := left; i <= right; i++ {
ans[index] = matrix[up][i]
index++
}
// 上面一行打印完了,上边界收缩
if up = up + 1; up > down {
break
}
// 从上往下打印
for i := up; i <= down; i++ {
ans[index] = matrix[i][right]
index++
}
// 右侧一列打印完了,右边界收缩
if right = right-1; right < left {
break
}
// 从右向左打印
for i := right; i >= left; i-- {
ans[index] = matrix[down][i]
index++
}
// 下面一行打印完毕,下边界收缩
if down = down-1; down < up {
break
}
// 从下往上打印
for i := down; i >= up; i-- {
ans[index] = matrix[i][left]
index++
}
// 左边一列打印完毕,左边界收缩
if left = left+1; left > right {
break
}
}
return ans
}
分圈进行打印,第一次循环,打印最外圈,分别收缩上、右、下、左边界,直至边界收缩到不合法时结束迭代,所以元素都已经加入到结果切片中了。

京公网安备 11010502036488号