054 Spiral Matrix 旋转打印矩阵

给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素。
例如,给出以下矩阵:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
应该返回 [1,2,3,6,9,8,7,4,5]。
详见:https://leetcode.com/problems/spiral-matrix/description/

Java实现:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res=new ArrayList<Integer>();
        if(matrix==null||matrix.length==0){
            return res;
        }
        int row=matrix.length;
        int col=matrix[0].length;
        
        int top=0;
        int bottom=row-1;
        int left=0;
        int right=col-1;
        while(top<=bottom&&left<=right){
            for(int j=left;j<=right;++j){
                res.add(matrix[top][j]);
            }
            ++top;
            for(int i=top;i<=bottom;++i){
                res.add(matrix[i][right]);
            }
            --right;
            if(top<=bottom){
                for(int j=right;j>=left;--j){
                    res.add(matrix[bottom][j]);
                }
            }
            --bottom;
            if(left<=right){
                for(int i=bottom;i>=top;--i){
                    res.add(matrix[i][left]);
                }
            }
            ++left;
        }
        return res;
    }
}

 C++实现:

class Solution {
public:
	vector<int> spiralOrder(vector<vector<int>>& matrix) {
		vector<int> res;
		if (matrix.empty())
			return res;

		int row = matrix.size();
		int col = matrix[0].size();

		int top = 0;
		int bottom = row - 1;
		int left = 0;
		int right = col - 1;

		//螺旋曲线,运动轨迹总是一致的  
		while (top <= bottom && left <= right)
		{
			//向右列递增遍历  
			for (int j = left; j <= right; j++)
			{
				res.push_back(matrix[top][j]);
			}
			top++; //遍历后,去掉此行  

						//向下行递增遍历  
			for (int i = top; i <= bottom; i++)
			{
				res.push_back(matrix[i][right]);
			}
			right--;   //遍历后,去掉此列  

			if (top <= bottom)  //重要判断,防止重复  
			{
				//向左列递减遍历  
				for (int j = right; j >= left; j--)
				{
					res.push_back(matrix[bottom][j]);
				}

			}
			bottom--;   //遍历后,去掉此行  

			if (left <= right)  //重要判断,防止重复  
			{
				//向上行递减遍历  
				for (int i = bottom; i >= top; i--)
				{
					res.push_back(matrix[i][left]);
				}
			}
			left++; //遍历后,去掉此列  
		}

		return res;
	}
};

 

posted on 2018-04-02 21:36  lina2014  阅读(129)  评论(0编辑  收藏  举报

导航