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
原文地址:https://www.cnblogs.com/higerzhang/p/4070298.html