算法---螺旋矩阵I

54.螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

解决思路:
我们做该类题型的时候,就像是一个绕圈圈的过程,从外及里一层层,就像是洋葱一样,我们可以先分四个循环遍历,但是同时在每次循环遍历时,都要考虑到边界,例如,我们从左到右遍历第一行的时候,可以将所有第一行的元素遍历完成,那么在从上到下遍历之前,我们就需要考虑第一行的最后一个元素是否在其下面有元素,这就是边界问题,同理,从右到左遍历之前,需要考虑右边的元素其左边是否有元素,以此类推,我们见js代码:

var spiralOrder = function(matrix) {
    
    
	// 定义一个数组,用于存储结果
    var res = new Array()
    // 获取二维数组的长度,即行数
    var m = matrix.length
    // 获取列数
    var n = matrix[0].length
    // 定义顶部位置
    var up = 0
    // 底部位置
    var down = m - 1
    // 左侧位置
    var left = 0
    // 右侧位置
    var right = n - 1
    while (true) {
    
    
    	// 从左到右遍历,[左,右]闭区间遍历
        for (let i = left; i <= right; i++) {
    
    
            res.push(matrix[up][i])
        }
        // 判断元素下方是否有没有遍历过的元素,没有,则遍历结束
        if (++up > down) {
    
    
            break
        }
        // 从上到下遍历,[上,下]闭区间遍历
        for (let i = up; i <= down; i++) {
    
    
            res.push(matrix[i][right])
        }
        // 判断右侧元素,其左边是否有没有遍历过的元素,没有,则结束
        if (--right < left) {
    
    
            break
        }
        // 从右到左遍历,[右,左]闭区间遍历
        for (let i = right; i >= left; i--) {
    
    
            res.push(matrix[down][i])
        }
        // 判断底部元素,其上边是否有没有遍历过的元素
        if (--down < up) {
    
    
            break
        }
        // 从下往上遍历
        for (let i = down; i >= up; i--) {
    
    
            res.push(matrix[i][left])
        }
        // 重新回到第一层循环前需要判断右边是否有没有遍历过的元素
        if (++left > right) {
    
    
            break
        }
    }
    return res
};

猜你喜欢

转载自blog.csdn.net/yldd_ldd/article/details/113847886