LeetCode.54.螺旋矩阵
难度:medium
Java:
简单的模拟法,从外围转圈向内部并且不断缩小边界;
未通过版本:
//未通过
class Solution {
public List spiralOrder(int[][] matrix) {
List list = new ArrayList<>();
int rows = matrix.length;
int columns = matrix[0].length;
int up = 0;
int down = rows - 1;
int left = 0;
int right = columns - 1;
while (true) {
for (int i = left; i <= right - 1; i++) {
list.add(matrix[up][i]);
}
if (++up > down) {
break;
}
for (int i = up - 1; i <= down - 1; i++) {
list.add(matrix[i][right]);
}
if(--right < left) {
break;
}
for (int i = right + 1; i >= left + 1; i--) {
list.add(matrix[down][i]);
}
if (--down < up) {
break;
}
for (int i = down + 1; i >= up; i--) {
list.add(matrix[i][left]);
}
if (++left > right) {
break;
}
}
return list;
}
}
通过版本:
通过判定边界,最后跳出;
class Solution {
public List spiralOrder(int[][] matrix) {
List list = new ArrayList<>();
int rows = matrix.length;
int columns = matrix[0].length;
int up = 0;
int down = rows - 1;
int left = 0;
int right = columns - 1;
while (true) {
for (int i = left; i <= right; i++) {
list.add(matrix[up][i]);
}
if (++up > down) {
break;
}
for (int i = up; i <= down; i++) {
list.add(matrix[i][right]);
}
if(--right < left) {
break;
}
for (int i = right; i >= left; i--) {
list.add(matrix[down][i]);
}
if (--down < up) {
break;
}
for (int i = down; i >= up; i--) {
list.add(matrix[i][left]);
}
if (++left > right) {
break;
}
}
return list;
}
}
通过判定是否将rows*columns个数存入数组,来判定是否跳出;
class Solution {
public List spiralOrder(int[][] matrix) {
List list = new ArrayList<>();
int rows = matrix.length;
int columns = matrix[0].length;
int up = 0;
int down = rows - 1;
int left = 0;
int right = columns - 1;
//矩阵一共有多少个元素
int num = rows * columns;
for (int element = 1; element <= num;) {
for (int i = left; i <= right; i++) {
list.add(matrix[up][i]);
element++;
}
++up;
for (int i = up; i <= down; i++) {
list.add(matrix[i][right]);
element++;
}
--right;
for (int i = right; i >= left; i--) {
list.add(matrix[down][i]);
element++;
}
--down;
for (int i = down; i >= up; i--) {
list.add(matrix[i][left]);
element++;
}
++left;
}
return list;
}
}
复杂度分析:
- 时间复杂度:O(n^2)
- 空间复杂度:O(1),除了返回数组外,空间复杂度是常数



