LeetCode 59. 螺旋矩阵 II 的 Rust 实现如下。
方法:分层填充(推荐)
思路
将矩阵看作一层一层的“壳”,从外层到内层逐层填充。
对于第 layer 层(从 0 开始),该层左上角坐标为 (layer, layer),右下角坐标为 (n - layer - 1, n - layer - 1)。每层按顺时针顺序填充四条边即可。
implSolution{pubfngenerate_matrix(n:i32)->Vec<Vec<i32>>{letn=nasusize;letmutmatrix=vec![vec![0;n];n];letmutnum=1;letlayers=(n+1)/2;// 总层数forlayerin0..layers{letstart=layer;letend=n-layer-1;// 1. 上边:从左到右forcolinstart..=end{matrix[start][col]=num;num+=1;}// 2. 右边:从上到下(注意跳过左上角已经填过的元素)ifstart<end{forrowin(start+1)..=end{matrix[row][end]=num;num+=1;}}// 3. 下边:从右到左(注意跳过右下角已经填过的元素)ifstart<end{forcolin(start..end).rev(){matrix[end][col]=num;num+=1;}}// 4. 左边:从下到上(注意跳过左下角和右上角已经填过的元素)ifstart<end{forrowin((start+1)..end).rev(){matrix[row][start]=num;num+=1;}}}matrix}}复杂度分析
· 时间复杂度:O(n²),每个位置恰好被赋值一次。
· 空间复杂度:O(1)(不考虑返回的矩阵)。
测试示例
letresult=Solution::generate_matrix(3);// result == [[1, 2, 3], [8, 9, 4], [7, 6, 5]]该实现直接适配 LeetCode 的函数签名,可直接提交。