螺旋矩阵——二维数组

剑指leetcode146——螺旋遍历二维数组

题目描述

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历:从左上角开始,按照 向右向下向左向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

示例 1:

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

示例 2:

输入:array  = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
算法思想

设置好上下左右四个边界。向右走时走到右边界后下一步要向下走所以上边界要-1,因为这轮的走法把上边界这层遍历完了所以上边界-1。向下走走到下边界后下一步要向左走这时右边界要-1,同理哟,想不明白仔细想~哈哈哈。向左走走到左边界后下一步要往上走,所以下边界要-1。向上走到上边界后下一步是要往右走,左边界要-1。直至越界结束——注意我所说的边界-1是指不断缩小边界范围,放在具体的二维数组中是+1,还是-1要看具体情况。

算法实现
vector<int> spiralArray(vector<vector<int>>& array) {
        //二维数组为空,返回空
        if(array.empty()) return vector<int>();
        vector<int> arr;
        //定义上下左右四个边界
        int up=0,left=0,down=array.size()-1,right=array[0].size()-1;
        int i,j;
        while(true){
            //向右走
            for(j=left;j<=right;j++){
                arr.push_back(array[up][j]);
            }
            //缩小上边界
            up++;j--;
            //判断是否越界
            if(up>down) break;
            //向下走
            for(i=up;i<=down;i++){
                arr.push_back(array[i][j]);
            }
            //缩小右边界
            right--;i--;
            //判断是否越界
            if(left>right) break;
            //向左走
            for(j=right;j>=left;j--){
                arr.push_back(array[i][j]);
            }
            //缩小下边界
            down--;j++;
            //判断是否越界
            if(up>down) break;
            //向上走
            for(i=down;i>=up;i--){
                arr.push_back(array[i][j]);
            }
            //缩小左边界
            left++;i++;
            //判断是否越界
            if(left>right) break;
        }
        return arr;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值