螺旋矩阵
一开始做的时候真的被绕蒙了,脑子都跟着转圈,后来做了两道题才找到了些规律。
这种题目属于模拟过程的题目,不涉及到什么算法,主要就是判断边界条件。
1.正方形矩阵
因为这道题中的矩阵是n阶正方形矩阵,所以循环的时候就有一定的规律,我们可以认为上下左右四个方向每次移动的长度一致,然后再根据每一圈的边界来修改循环判断条件,因为这里我们对循环圈数的判断是n/2,所以当n时奇数时,中间的点要单独判断。
//leetcode-59
class Solution {
public int[][] generateMatrix(int n) {
int [][]arr = new int[n][n];
int sum = 1;
//定义循环圈数
int loop = n / 2;
//t控制每个方向的赋值次数
int t = 1;
int start_i = 0;
int start_j = 0;
int i,j;
while(loop > 0){
for(j = start_j; j < n - t + start_j; j++){
arr[start_i][j] = sum++;
}
for(i = start_i; i < n - t +start_i; i++){
arr[i][j] = sum++;
}
for(; j > start_j; j--){
arr[i][j] = sum++;
}
for(; i > start_i; i--){
arr[i][j] = sum++;
}
t += 2;
start_i++;
start_j++;
loop--;
}
if(n % 2 == 1){
arr[n / 2][n / 2] = sum;
}
return arr;
}
}
2.普通矩阵
因为这个矩阵不是正方形矩阵,所以第一题的规律已经不适用,开始因为先入为主,做这道题的时候还依然想用上面的方法,后来发现越绕越乱,最后就决定上下左右分别进行判断,每个方向都详细的考虑其边界条件。
//leetcode-54
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int loop = (Math.min(m,n) + 1) / 2;
//声明当前循环的层数ceng
int ceng = 0;
while(loop > 0){
for(int j = ceng; j < n - ceng; j++){
list.add(matrix[ceng][j]);
}
for(int i = ceng + 1; i < m - ceng; i++){
list.add(matrix[i][n-1-ceng]);
}
for(int j = n - 2 - ceng; j >= ceng && (m - 1 - ceng != ceng); j--){
list.add(matrix[m-1-ceng][j]);
}
for(int i = m - 2 - ceng; i >= ceng + 1 && (n - 1 - ceng != ceng); i--){
list.add(matrix[i][ceng]);
}
loop--;
ceng++;
}
return list;
}
}
(m - 1 - ceng != ceng)
这句代码是判断的精髓,左边是表示当前循环圈的最下面一行,右边是表示当前循环圈的最上面一行,当左右相等时就代表当前循环圈只有一行,此时这一行的元素已经在上面第一个向右的循环中判断完毕,此时就可以跳出循环了,下面(n - 1 - ceng != ceng)
是判断是否只有一列,其他同理。
未完待续。。。