本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!!
第25道问题 剑指offer 29为一道简单题
题目:
力扣https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
1.自己思路
将这个二维数组分成一圈一圈地加入到数组中,最大圈数为矩阵中最下行列数/2+1.
添加过程中先确定4个边界的值,之后分别循环放入到数组中。
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix==null||matrix.length==0||(matrix.length==1&&matrix[0].length==0)) {
return new int[0];
}
int m = matrix.length;
int n = matrix[0].length;
int[] res = new int[m*n];
int count=0;
//最多可以打印几轮
int len = Math.min(m/2,n/2)+1;
for(int i=0;i<len;i++){
//打印的四个边界值
int l = i;
int r = n-i-1;
int low = i;
int high = m-i-1;
//打印上边的线
if(l<=r && low<=high){
for(int j=l;j<=r;j++){
if(count == m*n) break;
res[count++]=matrix[low][j];
}
}
//打印右侧的线
if(l<=r && low<=high){
for(int j=low+1;j<=high;j++){
if(count == m*n) break;
res[count++]=matrix[j][r];
}
}
//打印下侧的线
if(l<=r && low<=high){
for(int j=r-1;j>=l;j--){
if(count == m*n) break;
res[count++]=matrix[high][j];
}
}
//打印左侧的线
if(l<=r && low<=high){
for(int j=high-1;j>low;j--){
if(count == m*n) break;
res[count++]=matrix[j][l];
}
}
}
return res;
}
}
结果:
2.参考题解
1.构建一个Boolean 二维数组保存走过的路径,之后再确定边界条件,达到条件后更改方向。
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix==null||matrix.length==0||(matrix.length==1&&matrix[0].length==0)) {
return new int[0];
}
int m = matrix.length, n = matrix[0].length;
boolean[][] visited = new boolean[m][n];
int total = m * n;
int[] order = new int[total];
int row = 0, column = 0;
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
//边界条件,更改方向值
if (nextRow < 0 || nextRow >= m || nextColumn < 0 || nextColumn >= n || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
//一次次循环相加,真棒
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
}
结果:
总结:
利用一个二维数组确定方向,这个方法好。