【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
相关推荐
zhangfeng11336 小时前
Windows 的 Git Bash 中使用 md5sum 命令非常简单 md5做文件完整性检测 WinRAR 可以计算文件的 MD5 值
人工智能·windows·git·bash
参.商.7 小时前
【Day41】143. 重排链表
leetcode·golang
彭波3968 小时前
.NET Framework 3.5问题修复教程!可以离线修复
windows·安全·电脑·.net·开源软件
love530love9 小时前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
Zaly.10 小时前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵
memcpy012 小时前
LeetCode 1456. 定长子串中元音的最大数目【定长滑窗模板题】中等
算法·leetcode·职场和发展
AnalogElectronic12 小时前
windows递归遍历当前目录下文件并重命名程序
windows
web3.088899912 小时前
taoxi商品详情|商品属性|包装规格信息 API接口
windows
玛丽莲茼蒿12 小时前
LeetCode hot100【相交链表】【简单】
算法·leetcode·职场和发展
wen__xvn12 小时前
力扣模拟题刷题
算法·leetcode