• 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;
    	}
    };
    
  • 相关阅读:
    java中计算两个时间差
    增强for循环用法
    SQLServer类型与Java类型转换问题解决
    有关SQL模糊查询
    js 弹出div窗口 可移动 可关闭 (转)
    登陆sqlserver及修改端口号 (转)
    C#判断IP地址是否合法函数-使用正则表达式-2个 (转)
    c#图像处理入门(-bitmap类和图像像素值获取方法) 转
    MongoDB C#驱动中Query几个方法 (转)
    微信公众帐号自定义菜单创建及事件响应开发教程 附源代码(转)
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8697824.html
Copyright © 2020-2023  润新知