题解 | #螺旋矩阵#
螺旋矩阵
http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(up,left),右下角位于(down,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为(up,left)到(up,right)。
从上到下遍历右侧元素,依次为(up+1,right+1)到(down,right)。
如果left<right且up<down,则从右到左遍历下侧元素,依次为(down,right-1)到(down,left+1),以及从下到上遍历左侧元素,依次为(down,left)到(up+1,left)。
遍历完当前层的元素之后,将up和down分别增加,将right和left分别减少,进入下一层继续遍历,直到遍历完所有元素为止。
时间复杂度:O(n * m) n,m分别表示矩阵的行数和列数
空间复杂度:O(n * m) 需要用二维数组来储存结果
优缺点:比较难实现 但是相比之下在时间和空间上比较优
import java.util.*;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (matrix == null || matrix.length == 0) {
return result;
}
int left = 0;
int right = matrix[0].length - 1;
int up = 0;
int down = matrix.length - 1;
while (left <= right && up <= down) {
for (int column = left; column <= right; column++) {
result.add(matrix[up][column]);
}
for (int row = up + 1; row <= down; row++) {
result.add(matrix[row][right]);
}
//left < down防止情况:{{3},{2}} 实际输出:[3,2,2]
//up < down防止情况[[6,9,7]]实际输出[6,9,7,9]
if (left < right && up < down) {
for (int reverseColumn = right - 1; reverseColumn > left; reverseColumn--) {
result.add(matrix[down][reverseColumn]);
}
for (int reverseRow = down; reverseRow > up; reverseRow--) {
result.add(matrix[reverseRow][left]);
}
}
left++;
right--;
up++;
down--;
}
return result;
}
}刷刷题 文章被收录于专栏
刷刷题 活跃活跃脑细胞
查看5道真题和解析