详细思路

从最外层遍历,每一层,左上开始,右,下,左,上,维护上下左右最后一个元素边界,直到上小于下或者左大于右
 
精确定义
right右界,是先右遍历的最后一个元素下标
down
left
up
i第i个需要判断的元素
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>ans;
        int right=matrix[0].size()-1,down=matrix.size()-1,left=0,up=0;
        while(left<=right&&up<=down){
            for(int i=left;i<=right;i++)ans.push_back(matrix[up][i]);
            for(int i=up+1;i<=down;i++)ans.push_back(matrix[i][right]);
            if(left!=right&&up!=down){
                for(int i=right-1;i>=left;i--)ans.push_back(matrix[down][i]);
                for(int i=down-1;i>=up+1;i--)ans.push_back(matrix[i][left]);
            }

            right--,down--,left++,up++;
        }
        return ans;
    }
};
踩过的坑
            if(left!=right&&up!=down){
只剩最后一行或一列必须特判,不能继续下去,否则一定重复
posted on 2021-07-28 20:44  offer快到碗里来~  阅读(57)  评论(0)    收藏  举报