螺旋矩阵类通用思路
前言
提示:leetcode做题一定要看清楚题目,如果不懂题目可以去评论区看看大家对题目的理解。
忌讳:不懂题目的意思就答题
解题思路
- 总共有四种循环方式,我把这4种方式分为4个case。
- 设置分别设置这4个case的循环次数
- 根据循环方式迭代
54. 螺旋矩阵
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
代码实现
时间复杂度: O(n * m),空间复杂度: O(1)
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
List<Integer> integerList = new ArrayList<>(m * n);
spiral(integerList, matrix, 0, 0, n, m, 1);
return integerList;
}
/**
* @param list 最后返回结果集
* @param matrix 数据源
* @param i 一维数组下标
* @param ii 二维数组下标
* @param nBoundary 一维数组循环次数
* @param mBoundary 二维数组循环次数
* @param type 循环类型
*/
public void spiral(List<Integer> list, int[][] matrix, int i, int ii, int nBoundary,int mBoundary, int type) {
if (nBoundary == 0 || mBoundary == 0) {
return;
}
int index = 0;
switch (type) {
case 1:
while (index < mBoundary) {
list.add(matrix[i][ii]);
ii++;
index++;
}
spiral(list, matrix, ++i, --ii, --nBoundary, mBoundary, 2);
break;
case 2:
while (index < nBoundary) {
list.add(matrix[i][ii]);
i++;
index++;
}
spiral(list, matrix, --i, --ii, nBoundary, --mBoundary, 3);
break;
case 3:
while (index < mBoundary) {
list.add(matrix[i][ii]);
ii--;
index++;
}
spiral(list, matrix, --i, ++ii, --nBoundary, mBoundary, 4);
break;
case 4:
while (index < nBoundary) {
list.add(matrix[i][ii]);
i--;
index++;
}
spiral(list, matrix, ++i, ++ii, nBoundary, --mBoundary, 1);
break;
}
}
}
59. 螺旋矩阵 II
代码实现
时间复杂度: O(n2), 空间复杂度: O(1)
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
spiral(matrix, 1, 0, 0, n, 1);
return matrix;
}
/**
* @param matrix 结果集
* @param value 数据源
* @param i 一维数组下标
* @param ii 二维数组下标
* @param boundary 循环次数
* @param type 循环类型
*/
public void spiral(int[][] matrix, int value, int i, int ii, int boundary, int type) {
if (boundary == 0) {
return;
}
int index = 0;
switch (type) {
case 1:
while (index < boundary) {
matrix[i][ii] = value;
ii++;
index++;
value++;
}
spiral(matrix, value, ++i, --ii, --boundary, 2);
break;
case 2:
while (index < boundary) {
matrix[i][ii] = value;
i++;
index++;
value++;
}
spiral(matrix, value, --i, --ii, boundary, 3);
break;
case 3:
while (index < boundary) {
matrix[i][ii] = value;
ii--;
index++;
value++;
}
spiral(matrix, value, --i, ++ii, --boundary, 4);
break;
case 4:
while (index < boundary) {
matrix[i][ii] = value;
i--;
index++;
value++;
}
spiral(matrix, value, ++i, ++ii, boundary, 1);
break;
}
}
}