LeetCode(54)(59) Spiral Matrix I II

来源:互联网 发布:cr1000程序编程的书籍 编辑:程序博客网 时间:2024/05/16 19:33

一开始我是整体思考如何打印一个环,后来继续参考这篇文章,发现可以将顺时针打印一个环分解成打印上,结束,打印右,结束,打印下,结束,打印左,结束。这些操作的分解的基础基于一个事实:每个环的开头都是matrix[cycleNumber][cycleNumber]所以在打印“右”的时候不必再考虑“上”,减少动作之间的耦合可以使得思考更加容易。

Spiral Matrix I 代码如下:

class Solution {public:    vector<int> spiralOrder(vector<vector<int>>& matrix) {        vector<int> result;        if(0 == matrix.size())            return result;        int width = matrix[0].size();        int height = matrix.size();        int cycle = (min(width, height) + 1) / 2;        for(int cycleNumber = 0; cycleNumber < cycle; cycleNumber++) {            for(int column = cycleNumber; column - cycleNumber < width; column++)                 result.push_back(matrix[cycleNumber][column]);            for(int row = cycleNumber + 1; row - cycleNumber < height; row++)                result.push_back(matrix[row][cycleNumber + width - 1]);            if(1 == width || 1 == height) break;            for(int column = cycleNumber + width - 2; column - cycleNumber >= 0; column--)                result.push_back(matrix[cycleNumber + height - 1][column]);            for(int row = cycleNumber + height - 2; row - cycleNumber >= 1; row--)                 result.push_back(matrix[row][cycleNumber]);            width = width - 2;            height = height - 2;        }        return result;    }};

Spiral Matrix II 代码如下

class Solution {public:    vector<vector<int>> generateMatrix(int n) {        vector<vector<int> > matrix(n, vector<int>(n));        int width = n;        int height = n;        int counter = 1;        for(int cycleNumber = 0; cycleNumber < (n + 1) / 2; cycleNumber++) {            for(int column = cycleNumber; column - cycleNumber < width; column++)                matrix[cycleNumber][column] = counter++;            for(int row = cycleNumber + 1; row - cycleNumber < height; row++)                matrix[row][cycleNumber + width - 1] = counter++;            for(int column = cycleNumber + width - 2; column - cycleNumber >= 0; column--)                matrix[cycleNumber + height - 1][column] = counter++;            for(int row = cycleNumber + height - 2; row - cycleNumber > 0; row--)                matrix[row][cycleNumber] = counter++;            width = width - 2;            height = height - 2;        }        return matrix;    }};

参考JustDoIT

0 0
原创粉丝点击