宁波方正建设监理网站做了5天游戏推广被抓了
螺旋矩阵
- 题目描述
- 解题 收缩法
- 上期经典算法
题目描述
难度 - 中等
原题链接 - 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. 旋转图像