螺旋矩阵--力扣59

一、解题思路

这个题,很容易想到螺旋遍历数组,设置条件使螺旋数组转换方向。
此时容易出错,比如旋转时,忽略转一次过后上下左右界限的改变,思路:

1.首先明确规律

上左——上右;上右——右下;右下——下左;下左——上左;即为一圈;

2.确定界限定义

l,r,t,d;可以简单的确定以及表示四个方位界限,同时每转一次界限要改变,
比如左上——右上,相当于走完顶上第一行,t–;

3.代码实现

很容易想到从左到右是可以利用for循环对第一行数组元素赋值;以此内推
可以用四个for循环走完螺旋数组,同时for循环中 i 初始值以及范围都可根据界限设定

class Solution {
    public int[][] generateMatrix(int n) {
        int [][] mat = new int [n][n];
        // 直接定义四个边界,不用在条件里面限制,更加明确,以后写代码建议注意分离
        // t变化规律0,1,...,向下变化,d向上变化,l向右变化,r向左变化
        int t = 0;  int d = n-1;
        int l = 0;  int r = n-1;
        **// 定义数组值,并设置max计算出不要加在while中减少计算次数**
        int num = 1; int max = n*n;
        while(num <= max){
            // 分四步利用for循环进行移动赋值,思路通俗易懂
            // 1.向右移动
            for(int i = l;i <= r;i++) mat[t][i] = num++;
                // t++,已走完这一行,即t要加一向下移动一行,改变上方界限
                t++;
            
            // 2.向下移动
            for(int i = t;i <= d;i++) mat[i][r] = num++;
                //r减减改变右边界限,相当于走完这一条
                r--;
            
            // 3.向左移动
            // i >= l,因为边界改变了要小于左边界不是简单的大于0
            for(int i = r;i >= l;i--) mat[d][i] = num++;
                // 走完下方这一条,改变下方界限
                d--;
            
            // 4.向上移动
            // i>=t,以免走到已走过的一行
            for(int i = d;i >= t; i--){
                mat[i][l] = num++;
                // 已走完左边这一条,改变左边界限,为下一次向右移动做铺垫
                **// 注意此时使用for循环不要将改变界限的语句圈如,是for完执行改变界限语句**
            }
        l++;
           
        }
        return mat;
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值