Leetcode--螺旋矩阵

Leetcode 第59题:螺旋矩阵 Ⅱ

        解题思路:遵循一个循环不变量思想,即每层循环都是一条一条边的去填充,遵循左闭右开或者左开右闭的原则。如图所示:

填充时将每一行最后一个位置留出,把他算作下一条边,即每画一条边都要坚持一致的左闭右开,或者左开右闭。

解题代码如下:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> array(n,vector<int>(n,0));//定义二维数组
        //填充时将每一行最后一个位置留出,把他算作下一条边
        /*
            即每画一条边都要坚持一致的左闭右开,或者左开右闭
        */
        int startx = 0,starty = 0;//循环的起始位置
        int circle = n/2;//计算循环几圈
        int mid = n/2;//矩阵中心位置
        int count = 1;//从1开始填充
        int side = 1;//边界控制变量(此算法中为1,即每条边最后一个算作下一条边的填充)
        int i , j;
        while (circle)
    {
        //从起始位置开始
        i = startx;
        j = starty;

        for (j = starty; j < n - side; j++)//第一条横边
        {
            array[startx][j] = count++;
        }
        for (i = startx; i < n - side; i++)//第一条竖边
        {
            array[i][j] = count++;
        }
        for (; j > starty; j--)//第二条横边
        {
            array[i][j] = count++;
        }
        for (; i > startx; i--)//第二条竖边
        {
            array[i][j] = count++;
        }
        //每层循环的四条边遍历结束
        //第一次循环结束,重新设置起始点位
        startx += 1;
        starty += 1;
        circle -= 1;

        //每循环一圈,每行需要留的空位置就增一个
        side += 1;
    }
    //奇数行中间会留出单独一个位置
    if (n % 2 != 0)
        array[mid][mid] = count;

        return array;
    }
};

Leetcode 第54题:螺旋矩阵

        解题思路:与上一题的区别在于,这个矩阵不是n*n型,那么关键在于循环要走几次的问题,列出两个不同类型矩阵:

 可以看出需要循环的次数=矩阵最短边/2,其他部分与上面雷同。完整实现代码如下:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector <int> array;
        //设置起始位置
        int startx = 0,starty = 0;
        //求数组的行数和列数
        int m = matrix.size();//行
        int n = matrix[0].size();//列
        int circle;
        //哪条边短哪条边决定循环次数
        if (m<=n)
            circle = m/2;
        else
            circle = n/2;
        int side = 1;
        int i,j;
        while(circle)
        {
            i = startx;
            j = starty;
            
            for (j = starty; j< n-side; j++)
            {
                array.push_back(matrix[startx][j]);
            }
            for (i = startx; i < m-side; i++)
            {
                array.push_back(matrix[i][j]);
            }
            for (; j > starty; j--)
            {
                array.push_back(matrix[i][j]);
            }
            for (; i > startx; i--)
            {
                array.push_back(matrix[i][j]);
            }

            //更新起始点位
            startx += 1;
            starty += 1;
            circle -= 1;

            //每循环一次,边界增1
            side += 1;
        }
        //奇数行会有中间位置没循环到
        if(m<=n && m%2 != 0)
        {
            for(j = starty; j <= n-side; j++)
            {
                array.push_back(matrix[startx][j]);
            }
        }
        if (m > n && n%2 != 0)
        {
            for (i = startx ; i <= m - side; i++)
            {
                array.push_back(matrix[i][starty]);
            }
        }
        return array;
    }
};

剑指offer第29题:顺时针打印矩阵 

        解题思路与54题一致,代码可以直接用,注意判断输入数组是否为空,判断与语句如下:

if (matrix.size() == 0)
        {
            return {};
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值