【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
相关推荐
一点都不方女士6 分钟前
.NET Framework 4.0.30319:官方下载与常见问题解决指南
c++·windows·.net·动态链接库·运行库
我的xiaodoujiao18 分钟前
Windows系统Web UI自动化测试学习系列3--浏览器驱动下载使用
前端·windows·测试工具·ui
Y.O.U..2 小时前
力扣HOT100-跳跃游戏II
算法·leetcode
hn小菜鸡2 小时前
LeetCode 3132.找出与数组相加的整数 II
算法·leetcode·职场和发展
微笑尅乐2 小时前
数组模拟加法——力扣66.加一
算法·leetcode·职场和发展
_不会dp不改名_3 小时前
leetcode_146 LRU缓存
算法·leetcode·缓存
Dream it possible!4 小时前
LeetCode 面试经典 150_哈希表_快乐数(45_202_C++_简单)(哈希表;快慢指针)
leetcode·面试·散列表
萘柰奈5 小时前
LeetCode刷题记录----62.不同路径(Medium)
算法·leetcode·职场和发展
自信的小螺丝钉11 小时前
Leetcode 146. LRU 缓存 哈希表 + 双向链表
leetcode·缓存·散列表
谷咕咕13 小时前
windows下python3,LLaMA-Factory部署以及微调大模型,ollama运行对话,开放api,java,springboot项目调用
java·windows·语言模型·llama