**LeetCode 54. Spiral Matrix

本文介绍了一种解决螺旋矩阵遍历问题的算法实现。通过控制四个边界变量来完成矩阵的螺旋遍历,特别处理了单行单列的特殊情况。代码采用C++实现,并附带了一个简单的测试框架。

https://leetcode.com/problems/spiral-matrix/


水题做成这个样子真是说不过去,,

四个变量控制,两个控制左右范围,另个控制上下范围

两种特殊情况,只有一行和一列,因为push_back的时候其实只是考虑了行或者列的情况没有综合考虑 所以容易重复


#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <iostream>

using namespace std;

class Solution {
public:
    vector<int> spiralOrder( vector<vector<int> >& matrix) {
        vector <int> ret;
        if(matrix.size() == 0)
            return ret;
        if(matrix.size() == 1)return matrix[0];
        int left = 0, right = matrix[0].size(),hang=matrix.size(), h0=0;
        while(ret.size() < matrix.size()*matrix[0].size()) {
            //up
            for(int i=left;i<right;i++)
                ret.push_back(matrix[h0][i]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //right
            for(int i=h0+1;i<hang;i++)
                ret.push_back(matrix[i][right-1]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //down
            for(int i=right-2;i>=left;i--)
                ret.push_back(matrix[hang-1][i]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //left
            for(int i=hang-2;i>h0;i--)
                ret.push_back(matrix[i][left]);
            left ++;
            right --;
            hang --;
            h0++;
        }
        return ret;
    }
};

int main() {
    //freopen("54.txt", "r", stdin);
    int n,m, in;
    while(cin >> n >> m ){
        vector < vector<int> > mx;
        for(int i=0;i<n;i++) {
            vector <int> ivec;
            for(int j=0;j<m;j++) {
                cin >> in;
                ivec.push_back(in);
            }
            mx.push_back(ivec);
        }
        Solution s;
        vector <int> ans = s.spiralOrder(mx);
        for(int i=0;i<ans.size();i++)
            cout << ans[i] << ", ";
        cout << endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值