【数组专题】—— 模拟法

模 拟 法 \color{blue}{模拟法}


1.什么是模拟法?

据相传,模拟法是最不像算法的算法。通过模拟实现某种具体的要求。


2.LeetCode 59. 螺旋矩阵 II

(1) 此题就是一个典型的用模拟法来解决问题的。

(2) 我认为解决这个问题的关键在于找准关键点与边界的变化

(3) 通过二维数组来模拟比较形象,指定了顺时针方向移动也就决定了我们填充的顺序

(4) 首先定位到四个初始的边界:也就是上下左右,因为传入的参数为 n,数组的大小也就为 n * n。

top = 0
bottom = n - 1
left = 0
right = n - 1

  • 这里的定位是代表的是在数组中的索引

(5) 将整个填充的过程划分为四个方向上的填充

从左到右 —— 对应上边界
从上到下 —— 对应右边界
从右到左 —— 对应下边界
从下到上 —— 对应左边界

(6) 填充完一行或一列之后都会涉及到边界的变化

上边界填充完一次 top 要向下移动
下边界填充完一次 bottom 要向上移动
左边界填充完一次 left 要向右移动
有边界填充完一次 right 要向左移动


3.代码部分:

class Solution {
    public int[][] generateMatrix(int n) {
        //模拟法创建一个二维数组
        //对四个点进行定位
        int left = 0, right = n - 1;
        int top = 0, bottom = n - 1;

        /*
        对于整个填充流程我们可以看成四步:
            (1)从左向右填充
            (2)从上向下填充
            (3)从右向左填充
            (4)从下向上填充

        填充结果: 把 1-n^2 全部填充到矩阵中

        注意事项: 对于每一行和每一列完成填充后下一次填充可能涉及边界的变化

         */

         //定义一个数作为填充数
         int cut = 1;

        //定义一个二维数组
        int [][] arr = new int [n][n];

        //通过循环进行不断填充
         while(cut <= n * n){
             //自左向右
             for(int i = left; i <= right; i++){
                 arr[top][i] = cut;
                 cut++;
             }
             top++;

            //自上向下
            for(int i = top; i <= bottom; i++){
                arr[i][right] = cut;
                cut++;
            }
            right--;

            //自右向左
            for(int i = right; i >= left; i--){
                arr[bottom][i] = cut;
                cut++;
            }
            bottom--;

            //自下向上
            for(int i = bottom; i >= top; i--){
                arr[i][left] = cut;
                cut++;
            }
            left++;

         }

         return arr;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值