循环不变量原则之练习【1】

学习安排根据《代码随想录》~59

想了半个钟头找不到思路,个人感觉有以下难点:

一、数组索引怎么控制

二、如何确定循环几次

三、如何确定结束时间

看了解析,才有点头绪。

一、坐标控制元素位置

二、区间遵守 前闭后开 原则

三、循环次数根据 n来确定

四、二维数组存在一个中间位置 赋值

看完解析后,自己码了一遍代码还是出现各种错误,对照答案改了 并做一次总结:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) 
    {
        vector<vector<int>>res(n,vector<int>(n,0));//创建一个二维数组
        int x=0;int y=0;//记录元素坐标位置
        int loop=n/2 ;// 当n为3时,圈数为1圈,中间位置元素单独算
        int mid=n/2;//中间位置 n为3时 [1,1] n为5时 [2,2]
        int count =1;//从1开始计数
        int offset=1;
        int i,j;//用i,j来做循环判断

        while(loop--)
        {
            i=x;
            j=y;
            //初始化
            for(j=y;j<y+n-offset;j++)   //i 不变 j 变
            {
                res[x][j]=count++;
            }
            for(i=x;i<x+n-offset;i++) // j 不变 i变
            {
                res[i][j]=count++;
            }
            for(;j>y;j--) // i 不变 j变
            {
                res[i][j]=count++;
            }
            for(;i>x;i--)// j 不变 i变
            {
                res[i][j]=count++;
            }
            //下一圈开始 因为区间取值特性 x,y得从[1,1]开始
            x++;y++;
            // 因为区间取值特性,所以 下一层比上一层还要少2
             offset=offset+2;
        }
        
        //当 n为奇数时,中间位置需要令做处理
        if(n%2)
        {
            res[mid][mid]=count;
        }
        return res;
    }
};

重点:

1. for循环中的     for(j=y;j<y+n-offset;j++)

offset 设置为1,为了确保每条边末尾不计入前一次循环中,确保 前闭后开原则;

但是 当圈数进行到下一层时,offset 是会增加的,所以不可以设置为固定值。

2. x++;y++; 

下一圈开始的时候,元素坐标从 0,0 -> 1,1 ,再下一圈 从 2,2 开始, 所以每一圈开始前 起始的坐标发生变化

3.

  if(n%2)

        {

            res[mid][mid]=count;

        }

当n为奇数时,会单独 多出来一个中间元素 需另外计算。

(ps:圈数怎么看?)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值