【leetcode hot 100 54】螺旋矩阵

错误解法:以轮数定义旋转过程进行输出

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new LinkedList<>();
        int round=0; // 已经循环的轮数
        int i=0,j=0;
        int m=matrix.length, n=matrix[0].length;
        while(round==0||round<Math.min(m,n)/2){
            // 👉
            while(j<n-round){
                list.add(matrix[i][j]);
                j++;
            }
            // 👇
            j--;
            i++;
            while(i<m-round){
                list.add(matrix[i][j]);
                i++;
            }
            // 👈
            i--;
            j--;
            while(j>=round){
                list.add(matrix[i][j]);
                j--;
            }
            // 👆
            j++;
            i--;
            while(i>=round+1){
                list.add(matrix[i][j]);
                i--;
            }
            i++;
            j++;
            round++;
        }
        while(j<n-round){
            list.add(matrix[i][j]);
            j++;
        }
        return list;
    }
}

错误原因:不适合只有行的数组

解法一:对上面方法进行改进,更改循环结束的判断。

**如何判断路径是否结束?**由于矩阵中的每个元素都被访问一次,因此路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new LinkedList<>();
        int round=0; // 已经循环的轮数
        int len=0; // 路径长度
        int i=0,j=0;
        int m=matrix.length, n=matrix[0].length;
        // 👉
        while(j<n-round){
            list.add(matrix[i][j]);
            j++;
        }
        while(true){
            // 👇
            j--;
            i++;
            while(i<m-round){
                list.add(matrix[i][j]);
                i++;
                if(list.size()>=n*m){
                    break;
                }
            }
            if(list.size()>=n*m){
                break;
            }
            // 👈
            i--;
            j--;
            while(j>=round){
                list.add(matrix[i][j]);
                j--;
                if(list.size()>=n*m){
                    break;
                }
            }
            if(list.size()>=n*m){
                break;
            }
            // 👆
            j++;
            i--;
            while(i>=round+1){
                list.add(matrix[i][j]);
                i--;
                if(list.size()>=n*m){
                    break;
                }
            }
            if(list.size()>=n*m){
                break;
            }
            // 👉
            i++;
            j++;
            while(j<n-round-1){
                list.add(matrix[i][j]);
                j++;
                if(list.size()>=n*m){
                    break;
                }
            }
            if(list.size()>=n*m){
                break;
            }
            round++;
        }
        return list;
    }
}

注意:

  • 在每一次向list中加入数据,都判断是否到达指定数目,到达则break
相关推荐
SNAKEpc121381 小时前
OpenGL(十五)- 着色器语言GLSL
c语言·c++·线性代数·算法·矩阵·图形渲染·着色器
鹿角片ljp1 小时前
LeetCode 21. 合并两个有序链表
算法·leetcode·链表
Rabitebla2 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
evans在进步3 小时前
LeetCode 39:组合总和——Java DFS 回溯与剪枝详解
java·leetcode·深度优先
XWalnut3 小时前
LeetCode刷题 day37
java·数据结构·算法·leetcode
怦怦蓝4 小时前
Windows 安装 Docker Desktop 踩坑完整实战指南(WSL2 故障排错实录)
windows·docker·容器
碳基猿4 小时前
案例|新媒体/短视频矩阵代运营公司如何利用 CreBee 实现规模化交付:从“人力外包”到“内容运营服务系统”
矩阵·新媒体运营·用户运营·新媒体矩阵·多账号管理·矩阵运营方法论
evans在进步5 小时前
LeetCode 74:搜索二维矩阵——Java 虚拟一维数组与二分查找详解
java·leetcode·矩阵
星轨初途5 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
海盗12346 小时前
微软技术日报·2026-08-12——Windows 11多通道累积更新推送十余项功能改进;.NET WebSocket DoS紧急修复
windows·microsoft·.net