leetcode Spiral Matrix

题目:螺旋输出数组(听师兄说是今年google电话面试题)

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[

 [ 1, 2, 3 ],

 [ 4, 5, 6 ],

 [ 7, 8, 9 ]

]

You should return [1,2,3,6,9,8,7,4,5].

定义四个变量,上下左右,别人记录螺旋到的界限。到每一个边界,都需要判断是否遍历完。我用的是每个边界条件的判断。详见代码。leetcode的时间估计是不怎么准的,加了注释之后,说只运行了4ms。

class Solution {

public:

    vector<int> spiralOrder(vector<vector<int> > &matrix) 

    {

        vector<int> ans;

        if (matrix.size() == 0)

            return ans;

        int i = 0, j = 0, prei = -1, prej = -1, left = 0, up = 0, right = matrix[0].size() - 1, down = matrix.size() - 1;

        while(left <= right && up <= down)

        {

            prei += 1; prej += 1;

            i = prei; j = prej; // 绕一圈回来,如果还能继续走,那么下一个起点肯定是在之前起点右下方

            while(j <= right)

            {

                ans.push_back(matrix[i][j]); j++; // 把这一行输出

            }

            j--; i++;

            if (down == up) return ans; // 如果up和down属于同于一排了,说明无需再向下了

            while(i <= down)

            {

                ans.push_back(matrix[i][j]); i++;// 把最后一列输出(不包括和刚才输出行的最后一个)

            }

            i--; j--;

            if (left == right) return ans;// 如果左右相等了,说明无需再向左了

            while(j >= left)

            {

                ans.push_back(matrix[i][j]); j--;// 把左后一行向左输出

            }

            if (down == up + 1) return ans; // 满足这个时,已经不能再向上了

            j++; i--;

            while(i > up)

            {

                ans.push_back(matrix[i][j]); i--; // 把最左边一列输出

            }

            if (left == right - 1) return ans;//满足这个说明已经不能再向右了

            left++; right--; up++; down--;//更新各个值

        }

        return ans;

    }

};

其实也可以用一个cnt变量记录,如果cnt等于总的元素个数就结束。基本代码和上述一样,如下折叠代码。

class Solution {

public:

    vector<int> spiralOrder(vector<vector<int> > &matrix) 

    {

        vector<int> ans;

        if (matrix.size() == 0)

            return ans;

        int cnt = 0, i = 0, j = 0, prei = -1, prej = -1, left = 0, up = 0, right = matrix[0].size() - 1, down = matrix.size() - 1;

        int total = (matrix.size())*(matrix[0].size());

        while(left <= right && up <= down)

        {

            prei += 1; prej += 1;

            i = prei; j = prej; // 绕一圈回来,如果还能继续走,那么下一个起点肯定是在之前起点右下方

            while(j <= right)

            {

                ans.push_back(matrix[i][j]);cnt++;j++; // 把这一行输出

            }

            j--; i++;

            if (cnt == total) return ans;// 

            while(i <= down)

            {

                ans.push_back(matrix[i][j]);cnt++; i++;// 把最后一列输出(不包括和刚才输出行的最后一个)

            }

            i--; j--;

            if (cnt == total) return ans;// 

            while(j >= left)

            {

                ans.push_back(matrix[i][j]); cnt++;j--;// 把左后一行向左输出

            }

            if (cnt == total)  return ans; // 

            j++; i--;

            while(i > up)

            {

                ans.push_back(matrix[i][j]); cnt++; i--;// 把最左边一列输出

            }

            if (cnt == total) return ans;//

            left++; right--; up++; down--;//更新各个值

        }

        return ans;

    }

};
View Code

 

你可能感兴趣的:(LeetCode)