leetcode面试模拟题集

 周末稍作修整,按心情挑几道题目做做,看到了岗位面试题集,就点进来了~

这道题,leetcode上刷过类似的,是 n 平方的 螺旋矩阵,从这道题目来看,我还是没能掌握该题型!!

思路:

回顾:

leetcode 59 螺旋矩阵 给定 n * n 的矩阵,输出 顺时针的数组元素。解题的关键是 选择什么变量 作为循环的条件!!!答案:圈数,根据行列计算得到。由于是  方阵,因此,当出现 n%2 不为0时,不成圈,需要另外补值

本题:

最大的难点在于该矩阵为非方阵,因此圈数的计算以及多种补值的情况。

下图是对代码的注解,方便理解代码:

 代码:

bool flag=true;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int row=matrix.size();int col=matrix[0].size();
        vector<int>result;
        if(row==1&&col==1)return {matrix[row-1][col-1]};
        if(row==1||col==1)
        {
            int b=0;
            if(row==1)
            {
                while(b<col)
                result.push_back(matrix[row-1][b++]);
            }
            if(col==1)
            {
                while(b<row)
                result.push_back(matrix[b++][col-1]);
            }
            return result;
        }
        int i;
        int j;
        int q_turn=min(row,col)/2;//定义圈数
        int offset=1;//定义偏置
        int x=0;int y=0;//定义起始坐标
        while(q_turn--)
        {
            i=x;j=y;
            for(j=y;j<y+col-offset;j++)
            result.push_back(matrix[i][j]);
            for(i=x;i<x+row-offset;i++)
            result.push_back(matrix[i][j]);
            for(;j>y;j--)
            result.push_back(matrix[i][j]);
            for(;i>x;i--)
            result.push_back(matrix[i][j]);
            //一圈走完了。下一个起始结点
            x++;y++;
            offset=offset+2;//偏置
        }
       if(min(row,col)%2)
       {
           if(x==row-min(row,col)/2-1){
            while(y<col-min(row,col)/2)
                result.push_back(matrix[x][y++]);
           }
           else if(y==col-min(row,col)/2-1){
                while(x<row-min(row,col)/2)
                    result.push_back(matrix[x++][y]);
           }
       }
        return result;
    } 
};

很绕,需要好好消化!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值