菜鸡每日一题系列打卡54天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个包含m x n个元素的矩阵(m行, n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
题目分析
当看到这道题目的时候,菜鸡第一时间想到的是之前的一道旋转图像的题目。只要每次在每次遍历完一行之后,对二维数组进行逆时针旋转然后继续遍历,再遍历完一层之后调整一下遍历的边界即可。
那么,有没有更好的解法呢?进一步思考,其实不需要对数组进行旋转,数组旋转本质上对应的是坐标的变化,因此只需要找到坐标变化的规律,并在遍历过程中按规律改变坐标即可。话不多说,上代码!
代码实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
// 结果变量
List<Integer> result = new ArrayList<>();
// 特殊情况处理
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;
// 顺时针螺旋顺序边界
int rs = 0, re = matrix.length - 1, cs = 0, ce = matrix[0].length - 1;
// 遍历二维数组,每次while循环遍历一层
while (rs <= re && cs <= ce) {
// 从左到右,从上到下
for (int c = cs; c <= ce; c++) result.add(matrix[rs][c]);
for (int r = rs + 1; r <= re; r++) result.add(matrix[r][ce]);
// 从右到左,从下到上
if (rs < re && cs < ce) {
for (int c = ce - 1; c > cs; c--) result.add(matrix[re][c]);
for (int r = re; r > rs; r--) result.add(matrix[r][cs]);
}
// 遍历一层之后需要调整遍历的边界
rs++;
re--;
cs++;
ce--;
}
// 返回结果
return result;
}
}
代码分析
对代码进行分析,程序遍历了整个二维数组,因此,时间复杂度为O(mn),而就空间而言,如果考虑结果存储所需要的空间,则空间复杂度为O(mn),如果不考虑结果存储所需要的空间,则仅需要常数级别的额外空间,因此,空间复杂度为O(1)。
执行结果
相关链接
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到