59. 螺旋矩阵 II__模拟法,形象生动代码解读包教包会

59. 螺旋矩阵 II

715018DF-6717-4CCC-86F6-12A249F0E409.png

模拟法就是模拟数字填写的轨道,像一辆火车慢慢的行驶在设定的螺旋轨道上面


leftrighttopbottom就是起到约束作用的轨道
过程:
DFC50289-00A5-4927-9B63-F59F7250F19F.png
CD1A264F-8208-40AB-BB91-0ED078B35261.png

DEB4BAB6-CD58-4B0F-A322-0D794D3EBFB9.png
2257189A-E5B5-4239-95A5-D70CF786254E.png
55D4CD79-D6A9-40EB-A5A0-5EF654AA1ED1.png
6377D142-677B-40E2-96BB-ABF425092608.png

  for (int i = left; i <=right ; i++)  result[top][i]=num++;
        top++;

846E20D1-D43D-49B7-8858-45F0846AF019.png

  • 这一段是从leftright的轨道
    leftright方向行驶 (沿top=0这行轨道)
    行驶到边界的时候停车
    top方向向下移动一行

 for (int i = top; i <=bottom ; i++)  result[i][right]=num++;
        right--;

8465C1EC-A553-4E09-9239-4639695501EE.png

这一段是从topbottom的轨道
沿着right=2方向向下行驶
可知列车已经经过了3这个格子,应该从4格开始行进
而由top方向向下移动一行即top++的操作,已经完美的把列列车的起始位置摆到了4
right方向向左移动一行

 for (int i = right; i >=left ; i--) result[bottom][i]=num++;
        bottom--;

3ECFA742-CE87-4D6E-A20B-CA8CF103512E.png

这一段是从rightleft的轨迹
沿着bottom=2的轨迹向左行驶
同理,起始位置为6格子,同样是由中**right–**的操作做铺垫
行驶完成之后
bottom方向向上移动一行

  for (int i = bottom; i >=top ; i--) result[i][left]=num++;
        left++;

D03964C0-D47B-4E8C-9F4F-939D3F929928.png

这一段是从bottomtop的轨道
bottomtop方向行驶 (沿left=0这行轨道)
只行驶了8这一个格子

经过这四次轨道行驶之后
top=1,bottom=1,left=1,right=1
而由于num<=max(9<=9)说明最后一个中间的数字还没有添加上
则最后

 for (int i = left; i <=right ; i++)  result[top][i]=num++;
        top++;

nums[1][1](既是中间的数字)进行添加
8B4B5E27-42FF-428F-993C-25F1517D9564.png

之后的 top++、right–、bottom–、left++操作
使得for循环不能进入,最后由while (num<=max)跳出循环
得到
result

public int[][] generateMatrix(int n) {

    int result[][]=new int[n][n];
    int left=0,right=n-1,top=0,bottom=n-1;
    int num=1,max=n*n;

    while (num<=max){
        for (int i = left; i <=right ; i++)  result[top][i]=num++;
        top++;

        for (int i = top; i <=bottom ; i++)  result[i][right]=num++;
        right--;

        for (int i = right; i >=left ; i--) result[bottom][i]=num++;
        bottom--;

        for (int i = bottom; i >=top ; i--) result[i][left]=num++;
        left++;
    }
    return result;
}


#算法刷题与整理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值