题目:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(nums) {
    let temp = [];
    //设定上下左右的边界
    if(nums.length==0){

        return [];
    }
    let right = nums[0].length-1;
    let left = 0;
    let top = 0;
    let bottom = nums.length-1;

    while(true){

        for(let i=left;i<=right;i++){//向右移动
            temp.push(nums[top][i]);
        }
        if(++top>bottom){
            break;
        }

        //向下运动
        for(let i=top;i<=bottom;i++){
            temp.push(nums[i][right]);
        }
        if(--right<left){
            break;
        }

        //向左运动
        for(let i=right;i>=left;i--){
            temp.push(nums[bottom][i]);
        }
        if(--bottom<top){
            break;
        }

        //向上运行
        for(let i=bottom;i>=top;i--){
            temp.push(nums[i][left]);
        }
        if(++left>right){
            break;
        }

    }

    return temp;
};

实现:主要是通过不停的变换上下左右的边界,当从左边界开始,向右移动了一次,则上边界向下移动一位;向下移动的时候,从上边界开始,向下移动一次,右边界向左移动一位;当向左移动的时候,从右边界开始,向左移动一次,下边界向上移动一位;当向上移动的时候,从下边界开始向上移动一次,左边界向右移动一位;直到:上边界大于下边界,或是左边界大于有边界,说明所有数据都已经遍历过了。

来源:https://leetcode-cn.com/problems/spiral-matrix/solution/cxiang-xi-ti-jie-by-youlookdeliciousc-3/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

12-29 10:26