/*54、螺旋矩阵*/
/*思路一:
* 我们要设置一个标记来表示邻接的元素是已经走过的,因为题目中给出元素不会超过100,所以走过后将元素改为101
* 根据题意,要先判断右边是否有并且没有走过,有就走右边,否则继续判断下面是否有并且没有走过,有就走下边,否则继续判断上边是否有,有就走上边,
* 但是往上走可能右边有,但是我们需要继续走上面直到上面不能走了,所以往上走要一直走,走到尽头后才能往右走
* 每次要判断当前是否为101,如果是说明周围都已经走过了,遍历结束
* */
/*通过*/
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int i = 0, j = 0;
int m = matrix.length, n = matrix[0].length;
while (matrix[i][j] != 101) {
list.add(matrix[i][j]);
matrix[i][j] = 101;
if (j < n - 1 && matrix[i][j + 1] <= 100) {
j++;
} else if (i < m - 1 && matrix[i + 1][j] <= 100) {
i++;
} else if (j >= 1 && matrix[i][j - 1] <= 100) {
j--;
} else if (i >= 1 && matrix[i - 1][j] <= 100) {
while (matrix[i - 1][j] <= 100) {
i--;
list.add(matrix[i][j]);
matrix[i][j] = 101;
}
j++;
}
}
return list;
}
/*59、螺旋矩阵II*/
/*思路一:
* 遍历1-n²,从0,0坐标开始判断当前是否为0,如果为0说明未初始化,将当前是数字填入
* 如果不为0,退出
* 接着先判断右边是否存在并且为0,没有就是下边,再就是左,最后是上,往上判断依旧是一直到最顶端
* */
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int cnt = (int) Math.pow(n, 2);
int i = 0, j = 0;
for (int k = 1; k <= cnt; k++) {
nums[i][j] = k;
if (j < n - 1 && nums[i][j + 1] == 0) {
j++;
} else if (i < n - 1 && nums[i + 1][j] == 0) {
i++;
} else if (j >= 1 && nums[i][j - 1] == 0) {
j--;
} else if (i >= 1 && nums[i - 1][j] == 0) {
while (nums[i - 1][j] == 0) {
nums[--i][j] = ++k;
}
j++;
}
}
return nums;
}
/*498、对角线遍历*/
/*思路一:找规律
往哪里走是由当前层数奇偶决定的,而层数是由当前索引之和决定的(注意层数是从0开始)
若当前层为偶数,方向为上
如果列为最后一列,往下走
如果行为第0行,往右走
否则往右上走
若当前层为奇数,方向为下
如果行是最后一行,往右走
如果列是第0列,往下走
否则往左下走
*/
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length, n = mat[0].length;
int i = 0, j = 0;
int[] res = new int[m * n];
for (int k = 0; k < m * n; k++) {
res[k] = mat[i][j];
if ((i + j) % 2 == 0) {
if (j == n - 1) {
i++;
} else if (i == 0) {
j++;
} else {
i--;
j++;
}
} else {
if (i == m - 1) {
j++;
} else if (j == 0) {
i++;
} else {
i++;
j--;
}
}
}
return res;
}