算法练习题17——leetcode54螺旋矩阵

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

 代码

import java.util.*;

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 用于存储螺旋顺序遍历的结果
        List<Integer> result = new ArrayList<>();
        
        // 如果矩阵为空,直接返回空的结果列表
        if (matrix == null || matrix.length == 0) return result;

        // 获取矩阵的行数 m 和列数 n
        int m = matrix.length;      // 行数
        int n = matrix[0].length;   // 列数
        
        // 初始化四个边界,用于控制螺旋遍历的范围
        int top = 0;                // 上边界
        int bottom = m - 1;         // 下边界
        int left = 0;               // 左边界
        int right = n - 1;          // 右边界
        
        // 当上、下、左、右边界没有相互交错时,继续遍历
        while (top <= bottom && left <= right) {
            // 1. 从左到右遍历当前的上边界
            for (int i = left; i <= right; i++) {
                result.add(matrix[top][i]);  // 添加当前上边界的元素
            }
            top++;  // 上边界向下收缩一行,表示这一行已经处理完

            // 2. 从上到下遍历当前的右边界
            for (int i = top; i <= bottom; i++) {
                result.add(matrix[i][right]);  // 添加当前右边界的元素
            }
            right--;  // 右边界向左收缩一列,表示这一列已经处理完

            // 3. 从右到左遍历当前的下边界(仅当 top <= bottom 时)
            //    这里很重要!因为我们已经处理了上边界并将其收缩,
            //    所以在遍历下边界之前,需要确认是否还有剩余的行待遍历。
            if (top <= bottom) {
                for (int i = right; i >= left; i--) {
                    result.add(matrix[bottom][i]);  // 添加当前下边界的元素
                }
                bottom--;  // 下边界向上收缩一行,表示这一行已经处理完
            }

            // 4. 从下到上遍历当前的左边界(仅当 left <= right 时)
            //    这里同样很重要!因为我们已经处理了右边界并将其收缩,
            //    所以在遍历左边界之前,需要确认是否还有剩余的列待遍历。
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    result.add(matrix[i][left]);  // 添加当前左边界的元素
                }
                left++;  // 左边界向右收缩一列,表示这一列已经处理完
            }
        }
        
        // 返回螺旋顺序遍历的结果列表
        return result;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值