[剑指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;
            }
        }
    }
}

posted on 2019-04-07 21:31  coding_gaga  阅读(330)  评论(0编辑  收藏  举报

导航