螺旋矩阵
- 题目描述
- 解题 收缩法
- 上期经典算法
题目描述
难度 - 中等
原题链接 - leecode 54 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
解题 收缩法
解题的核心思路是按照右、下、左、上的顺序遍历数组,并使用四个变量圈定未遍历元素的边界:
随着螺旋遍历,相应的边界会收缩,直到螺旋遍历完整个数组:
把上面过程翻译成代码:
class Solution {
List<Integer> spiralOrder(int[][] matrix) {
int upper_bound = 0;
int lower_bound = matrix.length - 1;
int left_bound = 0;
int right_bound = matrix[0].length - 1;
List<Integer>ans = new LinkedList<>();
while(ans.size() < matrix.length * matrix[0].length){
//从左往右
if(upper_bound <= lower_bound){
for(int i = left_bound;i <= right_bound;i++){
ans.add(matrix[upper_bound][i]);
}
//上边界下移
upper_bound++;
}
//从上到下
if(left_bound <= right_bound){
for(int i = upper_bound;i <= lower_bound;i++){
ans.add(matrix[i][right_bound]);
}
//右边界左移
right_bound--;
}
//从右向左
if(upper_bound <= lower_bound){
for(int i = right_bound;i >= left_bound;i--){
ans.add(matrix[lower_bound][i]);
}
lower_bound--;
}
//从下向上
if(left_bound <= right_bound){
for(int i = lower_bound;i >= upper_bound;i--){
ans.add(matrix[i][left_bound]);
}
left_bound++;
}
}
return ans;
}
}
上期经典算法
leetcode48. 旋转图像