leetcode54:螺旋矩阵
-
题目: 给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
-
思路:首先,定义四个边界变量:upper_bound为上边界;right为右边界(根据要遍历的数组的每一行的数量-1);left_bound为左边界;lower_bound为下边界(二维矩阵的高度-1);
-
有四种遍历情况:
-
第一种:当upper_bound<=lower_bound时,从left_bound到right_bound依次遍历(从左到右);upper_bound+1;
-
第二种:当left_bound<=right_bound时,从upper_bound到lower_bound依次遍历(从上到下);right_bound-1
-
第三种:当upper_bound<=lower_bound时,从right_bound到left_bound依次遍历(从右到左);lower_bound-1;
-
第四种:当left_bound<=right_bound时,从lower_bound到upper_bound依次遍历(从下到上);left_round+1
class Solution { public List<Integer> spiralOrder(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int upper_bound = 0;//上边界 int lower_bound = m-1;//下边界 int left_bound = 0;//左边界 int right_bound = n-1;//右边界 List<Integer> res = new LinkedList<>(); while(res.size()<m*n){ //从左到右遍历;遍历完upper_bound+1 if(upper_bound<=lower_bound){ for(int i = left_bound;i<=right_bound;i++){ res.add(matrix[upper_bound][i]); } upper_bound++; } //从上到下遍历;遍历完right_bound-1 if(left_bound<=right_bound){ for(int i = upper_bound;i<=lower_bound;i++){ res.add(matrix[i][right_bound]); } right_bound--; } //从右到左遍历;遍历完lower_bound-1 if(upper_bound<=lower_bound){ for(int i =right_bound;i>=left_bound;i--){ res.add(matrix[lower_bound][i]); } lower_bound--; } //从下到上遍历;遍历完left_bound+1 if(left_bound<=right_bound){ for(int i = lower_bound;i>=upper_bound;i--){ res.add(matrix[i][left_bound]); } left_bound++; } } return res; } }
leetcode59:螺旋矩阵II
-
题目:给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。
-
思路:首先,定义四个边界变量:upper_bound为上边界;right为右边界(根据要遍历的数组的每一行的数量-1);left_bound为左边界;lower_bound为下边界(二维矩阵的高度-1);定义初始变量num为1;定义结果矩阵为n*n的二维数组;
-
有四种遍历情况:(每次遍历在矩阵中添加的元素为num++)
-
第一种:当upper_bound<=lower_bound时,从left_bound到right_bound依次遍历(从左到右);upper_bound+1;
-
第二种:当left_bound<=right_bound时,从upper_bound到lower_bound依次遍历(从上到下);right_bound-1
-
第三种:当upper_bound<=lower_bound时,从right_bound到left_bound依次遍历(从右到左);lower_bound-1;
-
第四种:当left_bound<=right_bound时,从lower_bound到upper_bound依次遍历(从下到上);left_round+1
class Solution { public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; int num = 1; int upper_bound = 0; int lower_bound = n-1; int left_bound = 0; int right_bound = n-1; while(num<=n*n){ //从左到右遍历;upper_bound+1 if(upper_bound<=lower_bound){ for(int i = left_bound;i<=right_bound;i++){ //说明num++,先赋值后加1;故while循环的条件为num<=n*n res[upper_bound][i]=num++; } upper_bound++; } //从上到下遍历;right_bound-1 if(left_bound<=right_bound){ for(int i = upper_bound;i<=lower_bound;i++){ res[i][right_bound]=num++; } right_bound--; } //从右到左遍历;lower_bound-1 if(upper_bound<=lower_bound){ for(int i = right_bound;i>=left_bound;i--){ res[lower_bound][i]=num++; } lower_bound--; } //从下到上遍历;left_bound+1 if(left_bound<=right_bound){ for(int i = lower_bound;i>=upper_bound;i--){ res[i][left_bound]=num++; } left_bound++; } } return res; } }