解法都在代码里,不懂就留言或者私信
这个题可能和算法关联不大,coding技巧为上
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
/**先定义结果集 */
List<Integer> ans = new ArrayList<>();
/**当前位置从(0,0)开始 */
int curRow = 0;
int curCol = 0;
Set<Integer> existsSet = new HashSet<>();
/**direction表示当前运动的方向,理论上应该先往右,左边走不动了往下,下面走不动了往左
左边走不动了网上,这里我们定义0,1,2,3分别代表右下左上四个方向*/
int direction = 0;
/**count表示矩阵中共有多少个数字 */
int count = matrix.length * matrix[0].length;
ans.add(matrix[0][0]);
existsSet.add(0);
/**已经加了一个点 */
int curCount = 1;
/**还没有收集够所有的就继续 */
while(curCount < count) {
/**根据方向确定下一个点走哪里*/
int rowNext = curRow;
int colNext = curCol;
/**根据方向不同确定行列的变化 */
switch(direction) {
case 0:
colNext ++;
break;
case 1:
rowNext ++;
break;
case 2:
colNext --;
break;
case 3:
rowNext --;
break;
}
if(!existsSet.contains(rowNext*matrix[0].length + colNext) && rowNext >= 0 && colNext >= 0 && rowNext < matrix.length && colNext < matrix[0].length) {
curRow = rowNext;
curCol = colNext;
/**把当前位置加进去 */
ans.add(matrix[curRow][curCol]);
existsSet.add(curRow*matrix[0].length + curCol);
curCount ++;
} else {
/**如果这个位置已经存在了或者越界了,变向 */
direction = (direction + 1)%4;
}
}
return ans;
}
}