欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 力扣HOT100之矩阵:54. 螺旋矩阵

力扣HOT100之矩阵:54. 螺旋矩阵

2025/4/3 6:26:13 来源:https://blog.csdn.net/weixin_52151595/article/details/146877719  浏览:    关键词:力扣HOT100之矩阵:54. 螺旋矩阵


这道题之前在代码随想录里刷过类似的,还有印象,我就按照当初代码随想录的思路做了一下,结果怎么都做不对,因为按照代码随想录的边界条件设置,当行数和列数都为奇数时,最后一个元素无法被添加到数组中,搞得很伤脑筋,然后我看了下灵神的代码,感觉还是有点太难懂了,我感觉Krahets大佬的代码思想和我的比较贴合,而且也比较好懂,我就直接采用他的思路了。他的思路比较朴素,就是按照上-->右-->下-->左的顺序遍历矩阵,然后将遍历到的元素添加到数组中,但是这个思路中是遍历一条边后就立刻更新对应的边界,例如,刚刚把上边界的所有元素添加到数组后,就立刻将上边界+1,然后遍历右边的边时,右边是直接从更新后的上边界为起点开始遍历的(这就意味着在同一圈中,上边界添加的元素一定比下边界添加的多,右边界添加的元素一定比左边界添加的多),另外,只要当前的下标值 <= 或者 >= 对应的边界值,我们就无脑添加,为了避免重复添加的问题,我们就需要在更新完边界以后立即判断上下边界有没有交错(up < down),左右边界有没有交错(left > right),如果出现了这样的情况,就说明已经打印完了所有元素,无需再继续遍历,直接退出当前的循环。
在退出循环之后,直接返回数组即可。

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> result;int up, right, down, left;   //上下左右四个边界up = 0;right = matrix[0].size() - 1;down = matrix.size() - 1;left = 0;while(up <= down && left <= right){//上for(int i = left; i <= right; ++i)result.emplace_back(matrix[up][i]);if(++up > down) break;  //添加结束//右for(int i = up; i <= down; ++i)result.emplace_back(matrix[i][right]);if(--right < left) break;  //添加结束//下for(int i = right; i >= left; --i)result.emplace_back(matrix[down][i]);if(--down < up) break;  //添加结束//左for(int i = down; i >= up; --i)result.emplace_back(matrix[i][left]);if(++left > right) break;}return result; }
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词