剑指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;
}