【LeetCode 0-Start】[数组]特定顺序遍历二维数组

本文详细介绍了三种特定顺序遍历二维数组的Java算法,包括54.螺旋矩阵、59.螺旋矩阵II和498.对角线遍历。针对每种情况,提供了相应的Java代码实现,讲解了算法思想和关键步骤,帮助读者理解如何按螺旋顺序和对角线顺序遍历二维数组。
摘要由CSDN通过智能技术生成

【LeetCode 0-Start】[数组]特定顺序遍历二维数组


前言

特定顺序遍历二维数组
题目序号: 54、59、498

一、[中等]54. 螺旋矩阵

题目来源
算法思想:二维矩阵
在这里插入图片描述

java代码

思路:螺旋,一层层读取数据;

注意:在本题中,因为不是方阵,是m*n,即m有可能不等于n;所以要时刻判断元素个数,是否读取完成,避免读取多了,即每个for循环中要判断N>0

主要思路与下面相似,要特别注意以上条件;

分析来源.
在这里插入图片描述

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<Integer>();
        if (matrix.length == 0) {//如果为空,直接返回
			return res;
		}
        int r = matrix[0].length-1;//右边界
        int l = 0;//左边界
        int t = 0;//上边界
        int b = matrix.length-1;//下边界
        int n = matrix[0].length*matrix.length;//元素总数量,用来判断是否还要继续读取
        
        while (n > 0) {//未读满时,继续读取
			for (int i = l; n > 0 && i <= r; i++) {//从左往右
				res.add(matrix[t][i]);
				n--;
			}
			t++;//缩小上边界
			for (int i = t; n > 0 && i <= b; i++) {//从上往下
				res.add(matrix[i][r]);
				n--;
			}
			r--;//缩小右边界
			for (int i = r; n > 0 && i >= l; i--) {//从左往右
				res.add(matrix[b][i]);
				n--;
			}
			b--;//缩小下边界
			for (int i = b; n > 0 && i >= t; i--) {//从下往上
				res.add(matrix[i][l]);
				n--;
			}
			l++;//缩小左边界
		}
        return res;//返回
    }
}

二、[中等]59. 螺旋矩阵 II

题目来源
算法思想:二维数组;
在这里插入图片描述

java代码

思路:螺旋,一层层生成数据;
分析来源.
在这里插入图片描述

class Solution {
    public int[][] generateMatrix(int n) {
		if (n == 0) {
			return null;
		}
		int[][] res = new int[n][n];
        int r = n-1;//右边界
        int l = 0;//左边界
        int t = 0;//上边界
        int b = n-1;//下边界
        int num = 1;//填入的数字
        n = n*n;//元素总数量,用来判断是否还要继续
        while (n > 0) {
			for (int i = l; i <= r; i++) {//从左往右
				res[t][i] = num;
				num++;
				n--;
			}
			t++;//缩小上边界
			for (int i = t; i <= b; i++) {//从上往下
				res[i][r] = num;
				num++;
				n--;
			}
			r--;//缩小右边界
			for (int i = r; i >= l; i--) {//从左往右
				res[b][i] = num;
				num++;
				n--;
			}
			b--;//缩小下边界
			for (int i = b; i >= t; i--) {//从下往上
				res[i][l] = num;
				num++;
				n--;
			}
			l++;//缩小左边界
		}
        return res;
    }
}

三、[中等]498. 对角线遍历

题目来源
算法思想:二维数组;
在这里插入图片描述

java代码

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length == 0) {//[],的情形
			return new int[0];
		}
		int M = matrix.length;//二维数组行数量
		int N = matrix[0].length;//二维数组列数量
		int[] res = new int[M * N];
        if (M == 1){//只有一行的情况
            for (int i = 0; i < N ; i++) {
                res[i]=matrix[0][i];
            }
            return res;
        }

        if (N == 1){//只有一列的情况
            for (int i = 0; i < M; i++) {
                res[i]=matrix[i][0];
            }
            return res;
        }
        //定义:向上(左下到右上)向下(右上到左下)
		boolean flag = true;//true标记向上,false标记向下
		int i = 0;
		int j = 0;
		for (int k = 0; k < res.length; k++) {//遍历
			res[k] = matrix[i][j];//填入res
			if (flag) {//如果向上,向右上角移动
				i--;
				j++;
			}else {//如果向下,向左下角移动
				i++;
				j--;
			}
            //判断是否越界,越界需要变换方向
            //向上越界情形:
			if (i < 0 || j >= N) {//左下到右上,越界情况:在第一行和最后一列越界
				if (j < N) {//在第一行越界
					i++;
					flag = false;//方向修改为向下
				}else {//在最后一列越界
					i = i + 2;
					j--;
					flag = false;//方向修改为向下
				}
			}
            //向下越界情形:
			if (j < 0 || i >= M) {//右上到左下,越界情况:第一列和最后一行越界
				if (i < M) {//第一列越界
					j++;
					flag = true;//方向修改为向上
				}else {//最后一行越界
					j = j + 2;
					i--;
					flag = true;//方向修改为向上
				}
			}
		}
		return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值