【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
相关推荐
cpsvps_net7 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
甄超锋8 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cpsvps10 小时前
美国服务器环境下Windows容器工作负载基于指标的自动扩缩
windows
网硕互联的小客服13 小时前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix13 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享14 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
非凡ghost15 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
mortimer16 小时前
一次与“顽固”外部程序的艰难交锋:subprocess 调用exe踩坑实录
windows·python·ai编程
gameatp18 小时前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
一匹电信狗18 小时前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio