zoukankan      html  css  js  c++  java
  • 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;
    	}
    };
    
  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8697824.html
Copyright © 2011-2022 走看看