Leetcode54:螺旋矩阵

2020-05-10  本文已影响0人  VIELAMI

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。


image.png

【思路】
确定一个前进方向,如果碰到矩阵边界,或者已经搜索的的位置则顺时针变换方向。

【坑】
考虑特殊情况 只有一个数字的矩阵,唯一的位置是(0,0)

vector<int> spiralOrder(vector<vector<int>>& matrix) {
    vector<vector<int>> record(matrix.size(), vector<int>(matrix[0].size(), 0));
    vector<int> res;
    int i = 0;
    int j = 0;
    vector<int> dirJ = { 1,0,-1,0 };
    vector<int> dirI = { 0,1,0,-1 };
    int dir = 0;
    int flagI = dirI[dir];
    int flagJ = dirJ[dir];
    while (true) {
        if (j<0 || j>= matrix[0].size() || i<0 || i>= matrix.size() || record[i][j] == 1) { //顺时针旋转方向
            i = i - dirI[dir];
            j = j - dirJ[dir];
            dir = (dir + 1) % 4;
            i = i + dirI[dir];
            j = j + dirJ[dir];
            //这个判断条件也要判断是否出界,只有0,0的特殊情况
            if (j < 0 || j >= matrix[0].size() || i < 0 || i >= matrix.size() || record[i][j] == 1) break;
            continue;
        }
        res.push_back(matrix[i][j]);
        record[i][j] = 1;
        i = i + dirI[dir];
        j = j + dirJ[dir];
    }
    for (int i = 0; i < res.size(); i++) {
        cout << res[i] << " ";
    }
    return res;

}
上一篇 下一篇

猜你喜欢

热点阅读