2021-02-20

3 篇文章 0 订阅
3 篇文章 0 订阅

「leetcode」54. 螺旋矩阵

思路

  1. 从矩阵整体上考虑,不要考虑每个具体坐标的移动
  2. 将矩阵抽象为矩形的嵌套,外层处理完成后,内层的处理逻辑与外层相同
  3. 处理特殊情况。当矩阵为1行n列,n行1列,m行n列时的情况
  4. 分别记录矩阵左上与右下两个位置,通过其行列坐标的变化,记录矩阵元素
func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return []int{}
	}
	// 分别定义矩阵左上与右下两个位置;记录行与列坐标
	lR, lC := 0, 0
	rR, rC := len(matrix)-1, len(matrix[0])-1

	res := []int{}
	// 由外层到内层进行打印
	for lR <= rR && lC <= rC {
		if lR == rR { // 1行n列
			for i := lC; i <= rC; i++ { // 向右边列递增
				res = append(res, matrix[lR][i])
			}
		} else if lC == rC { // n行1列
			for i := lR; i <= rR; i++ { // 向下边行递增
				res = append(res, matrix[i][lC])
			}
		} else { // m行n列
			curR, curC := lR, lC // 记录当前数所在的行与列
			for curC != rC {     // 行数不变,列数向右递增,打印上边行
				res = append(res, matrix[lR][curC])
				curC++
			}
			for curR != rR { // 列数不变,行数向下递增,打印右边列
				res = append(res, matrix[curR][rC])
				curR++
			}
			for curC != lC { // 行数不变,列数向左递减,打印下边行
				res = append(res, matrix[rR][curC])
				curC--
			}
			for curR != lR { // 列数不变,行数向上递减,打印左边列
				res = append(res, matrix[curR][lC])
				curR--
			}
		}
		// 矩阵层数-1
		lR++
		lC++
		rR--
		rC--
	}
	return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值