螺旋矩阵
题目形容:给你一个
m
行n
列的矩阵matrix
,请依照 顺时针螺旋程序 ,返回矩阵中的所有元素。示例阐明请见 LeetCode 官网。
起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:数组遍历
首先,用 row 和 column 别离记录 matrix 的行数和列数,count 为 matrix 所有的元素数量,初始化一个数量和 matrix 一样的二维数组用来标记相应地位的数字是否曾经遍历到,初始化 result 记录后果的程序,x 和 y 记录以后地位的索引地位,而后依照向右、向下、向左、向右的程序开始解决二维数组:
- 向右:将 y 往右挪动一位,判断是否超过 column 的界线并且挪动后的地位是否没有遍历过,如果符合条件,则将挪动后的地位的值放入 result 中,并且将 count 减一,并且将该地位的标记地位为 true,直到往右移不动为止;
- 向下:将 x 往下挪动一位,判断是否超过 row 的界线并且挪动后的地位是否没有遍历过,如果符合条件,则将挪动后的地位的值放入 result 中,并且将 count 减一,并且将该地位的标记地位为 true,直到往下移不动为止;
- 往左:将 y 往左挪动一位,判断是否不小于 0 并且挪动后的地位是否没有遍历过,如果符合条件,则将挪动后的地位的值放入 result 中,并且将 count 减一,并且将该地位的标记地位为 true,直到往左移不动为止;
- 往上:将上往左挪动一位,判断是否不小于 0 并且挪动后的地位是否没有遍历过,如果符合条件,则将挪动后的地位的值放入 result 中,并且将 count 减一,并且将该地位的标记地位为 true,直到往上移不动为止。
反复下面的过程,晓得 count 为 0 即所有的数字都遍历到为止,返回 result。
import java.util.ArrayList;
import java.util.List;
public class LeetCode_054 {public static List<Integer> spiralOrder(int[][] matrix) {int row = matrix.length, column = matrix[0].length, count = row * column, x = 0, y = -1;
boolean[][] flag = new boolean[row][column];
List<Integer> result = new ArrayList<>();
while (count > 0) {
// 向右
while (y + 1 < column && !flag[x][y + 1]) {
y = y + 1;
result.add(matrix[x][y]);
flag[x][y] = true;
count--;
}
// 向下
while (x + 1 < row && !flag[x + 1][y]) {
x = x + 1;
result.add(matrix[x][y]);
flag[x][y] = true;
count--;
}
// 向左
while (y - 1 >= 0 && !flag[x][y - 1]) {
y = y - 1;
result.add(matrix[x][y]);
flag[x][y] = true;
count--;
}
// 向上
while (x - 1 >= 0 && !flag[x - 1][y]) {
x = x - 1;
result.add(matrix[x][y]);
flag[x][y] = true;
count--;
}
}
return result;
}
public static void main(String[] args) {int[][] matrix = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
for (Integer integer : spiralOrder(matrix)) {System.out.print(integer + " ");
}
}
}
【每日寄语】 愿你明天温顺,优良,可恶,果决,一干二净。