Leetcode(54、59回形数/螺旋矩阵问题)

Leetcode54 螺旋矩阵一

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

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

思路:

典型的DFS问题。通过设立方向数组和标记数组即可实现。期间遇到的坑和知识点如下。

  • 判断二维数组为空的方式,分别用于判断数组不存在、{}、{{}}三种情况。
	if((matrix==null||matrix.length==0)||(matrix.length==1&&matrix[0].length==0)) 
  • 和传统的迷宫问题不同,此问题规定按照顺时针方向返回元素,即下一步移动方向是在当前步移动方向的基础上进行顺时针移动。换言之,方向不能每次都重置,而是基于之前的方向。

第一次未通过,原因是我错误地按照迷宫问题思路将方向不断重置,即每次都是按照右-下-左-上的顺序进行判断,违背了顺时针原则。出问题的代码如下:

			for(int d=0;d<4;d++){
                int newX = x + direction[d][0];
                int newY = y + direction[d][1];
                if(newX>=0&&newX<m&&newY>=0&&newY<n&&visit[newX][newY]==0){
                    x = newX;
                    y = newY;
                    break;
                }
            }

修改后代码:

			if(newX >= 0 && newX < m && newY >= 0 && newY < n && visit[newX][newY] == 0){
            	x = newX;
            	y = newY;
    		} else {
            	d = (d + 1) % 4;
            	x = x + direction[d][0];
            	y = y + direction[d][1];
     		}

最终代码:

public class Lc54 {
    public static void main(String[] args) {
        int[][] input = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        List<Integer> list = new ArrayList<Integer>();
        list = spiralOrder(input);
        System.out.println(list);
    }
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<Integer>();
        if ((matrix == null || matrix.length == 0) || (matrix.length == 1 && matrix[0].length == 0)) return list;
        int[][] direction = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] visit = new int[m][n];
        int x = 0, y = 0, d = 0;
        for (int i = 0; i < m * n; i++) {
            list.add(matrix[x][y]);
            visit[x][y] = 1;
            int newX = x + direction[d][0];
            int newY = y + direction[d][1];
            if (newX >= 0 && newX < m && newY >= 0 && newY < n && visit[newX][newY] == 0) {
                x = newX;
                y = newY;
            } else {
                d = (d + 1) % 4;
                x = x + direction[d][0];
                y = y + direction[d][1];
            }
        }

        return list;
    }
}

输出:
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]

Leetcode59 螺旋矩阵二

题目描述:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

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

思路同上题,代码也几乎相同,有了解决上道题的经验,这道题就显得游刃有余。

最终代码:

public class Lc59 {
    public static void main(String[] args) {
        int n = 5;
        int[][] target = generateMatrix(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.printf("%3d",target[i][j]);
            }
            System.out.println();
        }
    }

    public static int[][] generateMatrix(int n) {
        int[][] target = new int[n][n];
        int[][] visit = new int[n][n];
        int[][] direction = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int x = 0, y = 0, d = 0;
        for (int i = 1; i <= n * n; i++) {
            target[x][y] = i;
            visit[x][y] = 1;
            int newX = x + direction[d][0];
            int newY = y + direction[d][1];
            if(newX >= 0 && newX < n && newY >= 0 && newY < n && visit[newX][newY] == 0){
                x = newX;
                y = newY;
            } else {
                d = (d + 1) % 4;
                x = x + direction[d][0];
                y = y + direction[d][1];
            }
        }
        return target;
    }
}


输出:
1  2  3  4  5
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值