【Leetcode数组--矩阵】59. 螺旋矩阵 II 48. 旋转图像(很清晰的模拟方法,循环不变量原则)

Leetcode59

1.问题描述

在这里插入图片描述
在这里插入图片描述

2.解决方案

1.整体思路呢,看图和注释就明白了,就是一圈一圈的填充,其中每一圈都分四条边填充
2.重要的是这个循环不变量原则,这个通俗解释就是你需要使用你所定义的变量取描述你所在的圈和边,也就是第n圈,第k条边等等,都是使用一组变量去表示的,而不能加入用数字模拟出的一些值来描述圈和边
3.这样就不具备下一圈下一条边还适用的特点,这个是有点难以理解的,多理解!!!

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> ans(n,vector<int>(n,-1));
        int loop=n/2;           //矩阵总共有几圈,例如n为奇数3,那么loop=1,只是循环一圈,矩阵中间的值需要单独处理
        int startX=0,startY=0;  //每一圈开始的点(startX,startY)
        int lineLength=n-1;     //每一圈有四条边组成,第一圈边的长度为n-1
        int val=1;              //要给矩阵赋的值1,2,3...
        while((loop--)>0){
            //(i,j)==(startX,startY)
            int i=startX,j=startY;

            //每一条边的遍历赋值都要用到上一条边结束后的(i,j),这样更方便赋值
            //1.上边(长度n-1)(左闭右闭)--Y在变化--结束循环(i,j)在右上角了
            for(j=startY;j<=startY+lineLength-1;j++){
                ans[startX][j]=val++;
            }
            //2.右边(长度n-1)(左闭右闭)--X在变化--结束循环(i,j)在右下角了
            for(i=startX;i<=startX+lineLength-1;i++){
                ans[i][j]=val++;
            }
            //3.下边(长度n-1)(左闭右闭)--Y在变化--结束循环(i,j)在左下角了
            for(;j>=startY+1;j--){
                ans[i][j]=val++;
            }
            //4.左边(长度n-1)(左闭右闭)--X在变化--结束循环(i,j)在左上角了
            for(;i>=startX+1;i--){
                ans[i][j]=val++;
            }

            //循环结束,要想着while外面定义的五个全局变量,都看一遍看看哪个需要变,这样才不会漏掉某一个
            //1.第二圈开始的时候,起始位置要各自加1,例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            //2.下一圈一条边长度减2
            startX++; startY++;
            lineLength-=2;

        }

        //如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        //矩阵中间的位置,例如:n为3, 中间的位置就是n/2=(1,1),n为5,中间位置为n/2=(2, 2)
        if(n%2!=0) ans[n/2][n/2]=val;

        //结束
        return ans;
    }
};



Leetcode48

1.问题描述

在这里插入图片描述


2.解决方案

解法一:自外向内顺时针循环

在这里插入图片描述


解法二:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值