力扣题解(54. 螺旋矩阵),带注释

题目描述

链接:点我

题解

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length , n = matrix[0].length;
        // int[] ans = new int[m*n];
        ArrayList<Integer> list = new ArrayList<Integer>();
        //定义4个边界
        int up = 0 , right = n - 1 , down = m - 1 , left = 0;
        // while(true){
        //     for(int i = left;i <= right; i++) list.add(matrix[up][i]);
        //     if(up++ >= down) break;  //更新边界越界就退出循环,同时表示也遍历完成,下方同理
            
        //     for(int i = up;i <= down; i++) list.add(matrix[i][right]);
        //     if(right-- <= left) break;
            
        //     for(int i = right;i >= left; i--) list.add(matrix[down][i]);
        //     if(down-- <= up) break;
            
        //     for(int i = down;i >= up; i--) list.add(matrix[i][left]);
        //     if(left++ >= right) break;
        // }
        

        //法二:相同的思维
        int k = 0;  //类似数组的长度道理,只需要遍历那么多次就行了
        while(k < m*n){
            for(int i = left;i <= right; i++) {
                //边界不可越出,下方同理
                if(up <= down){
                    list.add(matrix[up][i]);
                    k++;
                }
            }
            up++; //每次遍历一行/列都要更新边界,下方同理
            
            for(int i = up;i <= down; i++) {
                if(right >= left){
                    list.add(matrix[i][right]);
                    k++;
                }             
            }
            right--;
            
            for(int i = right;i >= left; i--) {
                if(down >= up){
                    list.add(matrix[down][i]);
                    k++;
                }           
            }
            down--;
            
            for(int i = down;i >= up; i--) {
                if(left <= right){
                    list.add(matrix[i][left]);
                    k++;
                }    
            }
            left++;
        }
        return list;
    }
}
相关推荐
YGGP13 分钟前
【Golang】LeetCode 64. 最小路径和
算法·leetcode
古城小栈2 小时前
Rust变量设计核心:默认不可变与mut显式可变的深层逻辑
算法·rust
电商API&Tina2 小时前
跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程
大数据·服务器·数据库·python·算法·json·图搜索算法
LYFlied2 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
长安er3 小时前
LeetCode 20/155/394/739/84/42/单调栈核心原理与经典题型全解析
数据结构·算法·leetcode·动态规划·
MarkHD4 小时前
智能体在车联网中的应用:第28天 深度强化学习实战:从原理到实现——掌握近端策略优化(PPO)算法
算法
能源系统预测和优化研究4 小时前
【原创代码改进】考虑共享储能接入的工业园区多类型负荷需求响应经济运行研究
大数据·算法
yoke菜籽4 小时前
LeetCode——三指针
算法·leetcode·职场和发展
小高不明5 小时前
前缀和一维/二维-复习篇
开发语言·算法
bin91535 小时前
当AI优化搜索引擎算法:Go初级开发者的创意突围实战指南
人工智能·算法·搜索引擎·工具·ai工具