【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
相关推荐
love530love14 分钟前
技术复盘:llama-cpp-python CUDA 编译实战 (Windows)
人工智能·windows·python·llama·aitechlab·cpp-python·cuda版本
VT.馒头2 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
毅炼3 小时前
hot100打卡——day17
java·数据结构·算法·leetcode·深度优先
Tisfy3 小时前
LeetCode 3010.将数组分成最小总代价的子数组 I:排序 OR 维护最小次小
算法·leetcode·题解·排序·最小次小值
开开心心就好3 小时前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
2601_949532844 小时前
Psello HTML Template: A Developer‘s Deep-Dive Review and Guide - Download Free
前端·windows·html·seo·wordpress·gpl
草履虫建模5 小时前
力扣算法 121. 买卖股票的最佳时机
算法·leetcode·职场和发展·贪心算法·动态规划·一次遍历
爱尔兰极光5 小时前
LeetCode--有序数组的平方
算法·leetcode·职场和发展
haluhalu.5 小时前
LeetCode---基础算法刷题指南
数据结构·算法·leetcode
iAkuya5 小时前
(leetcode)力扣100 58组合总和(回溯)
算法·leetcode·职场和发展