跟着代码随想录刷力扣(LeetCode)02


前言

记录跟着“代码随想录”刷力扣的过程
链接: 代码随想录


数组部分(二)

六、螺旋矩阵II

59.螺旋矩阵II

思路:设置计数器count,count>n*n时结束循环。
初始时,第0行为上边界,第n-1行为下边界,下标0为左边界,下标n-1为右边界。自左向右填充完后,行的上边界+1;然后自上往下填充,右边界-1;然后自右向左填充,下边界-1;然后自下而上填充,左边界+1。
在这里插入图片描述

class Solution {
    public int[][] generateMatrix(int n) {
       int[][] m=new int[n][n];
       int count=1;
       int top=0,bottom=n-1,left=0,right=n-1;
       while(count<=n*n){
           for(int i=left;i<=right;i++) m[top][i]=count++;
           top--;
           for(int i=top;i<=bottom;i++) m[i][right]=count++;
           right--;
           for(int i=right;i>=left;i--) m[bottom][i]=count++;
           bottom--;
           for(int i=bottom;i>=top;i--) m[i][left]=count++;
           left--;
       }
        return m;
    }
}

54. 螺旋矩阵

注意点:因为题目要求 m 行 n 列的矩阵 matrix 不一定是方阵。上一题中方阵的left>right时,top>bottom,反之一样,所以不会出现重复读的情况。但不是方阵时,当 top>bottom时,left不一定大于right,可能重复读,所以需要读完某一列(行)后判断整个矩阵是否已经读完。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m=matrix.length,n= matrix[0].length;
        ArrayList<Integer> list = new ArrayList<>();
        int left=0,right=n-1,top=0,bottom=m-1;
        while(true){
            for(int i=left;i<=right;i++) {
                list.add(matrix[top][i]);
            }
            top++;
            if(top>bottom) break;
            for(int i=top;i<=bottom;i++) {
                list.add(matrix[i][right]);
            }
            right--;
            if(right<left) break;
            for(int i=right;i>=left;i--) {
                list.add(matrix[bottom][i]);
            }
            bottom--;
            if(bottom<top) break;
            for(int i=bottom;i>=top;i--) {
                list.add(matrix[i][left]);
            }
            left++;
            if(left>right) break;
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值