leetcode 54.螺旋矩阵

  1. 螺旋矩阵
    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:
在这里插入图片描述

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

思路:从外向内,顺时针遍历,每条边始终保持“左闭右开”。最内一层不是环状时需单独处理。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ret;
        int h = matrix.size();
        int w = matrix[0].size();
        int n = w < h ? w : h;
        int layers = n / 2; // 层数用宽、高小的指来取
        int l = 0;
        int startx = 0, starty = 0;
        int i = 0, j = 0;
        int offset = 1; // 左闭右开,除去最后边位置
        while (l < layers) { // 层数为奇数时,最内一层先不作处理
            for (j = starty; j < starty + w - offset; j++) {
                ret.push_back(matrix[startx][j]);
            }
            for (i = startx; i < startx + h - offset; i++) {
                ret.push_back(matrix[i][j]);
            }
            for(; j > starty; j--) { // j的位置保持上一次结束的位置不变
                ret.push_back(matrix[i][j]);
            }
            for(; i > startx; i--){// i的位置保持上一次结束的位置不变
                ret.push_back(matrix[i][j]);
            }
            offset += 2; // 每向内一层,每行/列少两个元素
            startx++; // 起始位置更新
            starty++;
            l++;
        }

        // 层数为奇数时,处理最内一层
        if(h > w && ((w % 2) == 1)) { // 最内一层只有一列,从上到下一次读取
            for(i = startx; i < startx + h - offset + 1; i++){ // +1:offser初始化为1(作左闭右开没有包含最右边位置)
                ret.push_back(matrix[i][starty]);
            }
        }else if(h < w && ((h % 2) == 1)){ // 最内一层只有一行,,从左往右一次读取
            for(j = startx; j < starty + w - offset + 1; j++){
                ret.push_back(matrix[startx][j]);
            }
        }else if((w == h) && ((n % 2) == 1)) // 行列相等,且为奇数时,获取最中间的位置
            ret.push_back(matrix[startx][starty]);
        return ret;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值