巩固练习螺旋矩阵-54/剑指Offer 29

文章介绍了如何用JavaScript和Python解决螺旋矩阵遍历问题,给出了详细的解题思路和代码实现,强调了边界条件处理和循环顺序的重要性。
摘要由CSDN通过智能技术生成

54. 螺旋矩阵

解题思路

出现的问题

JavaScript解法代码

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    let column = matrix.length
    let row = matrix[0].length
    let left=0, right=row-1, top=0, bottom=column-1;
    let output = []
    while(left <= right && top<=bottom){
        for(let i=left;i<=right;i++){
            output.push(matrix[top][i])
        }
        for(let j=top+1;j<=bottom;j++){
            output.push(matrix[j][right])
        }
        if(left < right && top< bottom){
            for(let i=right-1;i>=left;i--){
                output.push(matrix[bottom][i])
            }
            for(let j=bottom-1;j>top;j--){
                output.push(matrix[j][left])
            }
        }
        left++
        right--
        top++
        bottom--
    }
    return output
};

Python解法代码

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        column = len(matrix)
        row = len(matrix[0])
        left=0
        right=row-1 
        top=0
        bottom=column-1
        output = []
        while(left <= right and top<=bottom):
            for i in range(left,right+1):
                output.append(matrix[top][i])
            
            for j in range(top+1,bottom+1):
                output.append(matrix[j][right])
            
            if(left < right and top< bottom):
                for i in range(right-1,left-1,-1):
                    output.append(matrix[bottom][i])
                
                for j in range(bottom-1,top,-1):
                    output.append(matrix[j][left])
            
            left+=1
            right-=1
            top+=1
            bottom-=1
        
        return output

剑指Offer 29

同样的题。


总结:

螺旋输出主要是思路清楚、边界清楚。通解:

// 定义left,right,top,bottom
while(left <= right && top<=bottom){
    for(let i=left;i<=right;i++){
        // 从左上至右上
    }
    for(let j=top+1;j<=bottom;j++){
        // 从右上至右下
    }
    if(left < right && top< bottom){
        for(let i=right-1;i>=left;i--){
            // 从右下至左下
        }
        for(let j=bottom-1;j>top;j--){
            // 从左下至右上
        }
    }
    left++
    right--
    top++
    bottom--
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值