zoukankan      html  css  js  c++  java
  • [剑指Offer]29-顺时针打印矩阵 / [LeetCode]54. 螺旋矩阵

    题目链接

    https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

    题意

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

    示例 1:

    输入:
    [
    [ 1, 2, 3 ],
    [ 4, 5, 6 ],
    [ 7, 8, 9 ]
    ]
    输出: [1,2,3,6,9,8,7,4,5]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/spiral-matrix
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路(方法二)(思路较优)

    • 记录矩阵当前上下左右边界,并维护。
    • 步骤:放入矩阵第一行,更新矩阵上边界,判断若上边界>下边界则完成矩阵遍历;放入矩阵最后一列...

    代码(方法二)

    class Solution {
       	public List<Integer> spiralOrder(int[][] matrix) {
    		List<Integer> ansList = new ArrayList<>();
    		if (matrix == null || matrix.length == 0) {
    			return ansList;
    		}
    
    		// 定义上下左右边界
    		int l = 0;
    		int up = 0;
    		int r = matrix[0].length - 1;
    		int down = matrix.length - 1;
    		while (true) {
    			// 第一行
    			for (int i = l; i <= r; ++i) {
    				ansList.add(matrix[up][i]);
    			}
    			if (++up > down) {
    				break;
    			}
    
    			// 最后一列
    			for (int i = up; i <= down; ++i) {
    				ansList.add(matrix[i][r]);
    			}
    			if (--r < l) {
    				break;
    			}
    
    			// 最后一行
    			for (int i = r; i >= l; --i) {
    				ansList.add(matrix[down][i]);
    			}
    			if (--down < up) {
    				break;
    			}
    
    			// 第一列
    			for (int i = down; i >= up; --i) {
    				ansList.add(matrix[i][l]);
    			}
    			if (++l > r) {
    				break;
    			}
    		}
    		return ansList;
    	}
    }
    

    解题思路(方法一)

    用子矩阵的左上角和右下角代表子矩阵,循环打印子矩阵,打印子矩阵的最外圈。
    循环最外圈时,先判子矩阵只剩一行/一列的情况。

    代码(方法一)

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printMatrix(int [][] matrix) {
            int lR=0;
            int lC=0;
            int rR=matrix.length-1;
            int rC=matrix[0].length-1;
            int size=matrix.length*matrix[0].length;
            ArrayList<Integer> circleAL=new ArrayList<Integer>(size);//
            while(lR<=rR&&lC<=rC){
                printCircle(matrix,lR++,lC++,rR--,rC--,circleAL);//
            }
            return circleAL;
        }
        
        private void printCircle(int[][] matrix,int lR,int lC,int rR,int rC,ArrayList<Integer> circleAL){
            if(lR==rR){
                for(int j=lC;j<=rC;++j){
                    circleAL.add(matrix[lR][j]);//
                }
            }
            else if(lC==rC){
                for(int i=lR;i<=rR;++i){
                    circleAL.add(matrix[i][lC]);
                }
            }
            else{
                int i=lR;
                int j=lC;
                while(j!=rC){
                    circleAL.add(matrix[i][j]);
                    ++j;
                }
                while(i!=rR){
                    circleAL.add(matrix[i][j]);
                    ++i;
                }
                while(j!=lC){
                    circleAL.add(matrix[i][j]);
                    --j;
                }
                while(i!=lR){
                    circleAL.add(matrix[i][j]);
                    --i;
                }
            }
        }
    }
    
  • 相关阅读:
    JSON.stringify深拷贝的缺点
    Vue生命周期和详细的执行过程
    CSS中width:100%和width:auto的区别
    react中的setState的使用和深入理解
    一文看懂Chrome浏览器运行机制
    闭包和垃圾回收机制
    linux 下的文件下载和上传
    mvn install本地安装jar到指定仓库
    内网maven依赖仓库jar报错解决
    hbase源码编译调试
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10667242.html
Copyright © 2011-2022 走看看