螺旋矩阵

题目:

给定一个包含 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;
};

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

 

 2.

题目:

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

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

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(num) {
      let temp = [];
    for(let i=1;i<=num;i++){
        let demo = [];
        for(let j=1;j<=num;j++){
           demo.push(0);
        }
        temp.push(demo);
    }
    
    let left = 0;
    let right = num-1;
    let top = 0;
    let bottom = num-1;
    let count = 0;
    let end = num*num;
   
    while(true){
         //向左运动
        for(let i=left;i<=right;i++){
            temp[top][i] = ++count;
        }
        if(++top>bottom||count>end){
            break;
        }
        //向下
        for(let i=top;i<=bottom;i++){
            temp[i][right] = ++count;
        }
        if(--right<left||count>end){
            break;
        }
        //向左
        for(let i=right;i>=left;i--){
            temp[bottom][i] = ++count;
        }
        if(--bottom<top||count>end){
            break;
        }
        //向上
        for(let i=bottom;i>=top;i--){
            temp[i][left] = ++count;
        }
        if(++left>top||count>end){
            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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2019-10-25 21:33  唐糖PJS  阅读(197)  评论(0编辑  收藏  举报