【leetcode学习记录】

螺旋矩阵

一开始做的时候真的被绕蒙了,脑子都跟着转圈,后来做了两道题才找到了些规律。
这种题目属于模拟过程的题目,不涉及到什么算法,主要就是判断边界条件。

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)是判断是否只有一列,其他同理。

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值