1.螺旋矩阵 II
b站视频讲解-代码随想录
重点:循环不变量,对每条边的处理规则要统一,比如都按照左闭右开原则处理。
①模拟(版本一)
var generateMatrix = function(n) {
const ans=new Array(n).fill(0).map(()=>new Array(n).fill(0));
var start=1,l=0,r=n-1,t=0,b=n-1;
while(start<=n*n){
for(let i=l;i<=r;i++){
ans[t][i]=start++;
}
for(let j=t+1;j<=b;j++){
ans[j][r]=start++;
}
for(let k=r-1;k>l;k--){
ans[b][k]=start++;
}
for(let m=b;m>t;m--){
ans[m][l]=start++;
}
[l,r,t,b]=[l+1,r-1,t+1,b-1]
}
return ans;
};
②模拟(代码随想录版)
var generateMatrix = function(n) {
let startX=0,startY=0; // 起始位置
let loop=Math.floor(n/2); // 控制循环圈数
let mid=Math.floor(n/2); // n为奇数时最中间的位置
let offset=1; //控制填充圈逐渐变小
let count=1; // 填充的数字
const ans=new Array(n).fill(0).map(()=>new Array(n).fill(0));
while(loop--){
let row=startX,col=startY;
// 上行,改变的是列值
for(;col<n-offset;col++){
ans[row][col]=count++;
}
for(;row<n-offset;row++){
ans[row][col]=count++;
}
for(;col>startY;col--){
ans[row][col]=count++;
}
for(;row>startX;row--){
ans[row][col]=count++;
}
// 每填充一圈,就更新起始位置
startX++;
startY++;
offset++;
}
if(n%2===1){
ans[mid][mid]=count;
}
return ans;
};
2.螺旋矩阵
var spiralOrder = function(matrix) {
const m=matrix.length,n=matrix[0].length;
const ans=[];
let t=0,l=0,r=n-1,b=m-1;
while(l<=r&&t<=b){
for(let i=l;i<=r;i++){
ans.push(matrix[t][i]);
}
for(let j=t+1;j<=b;j++){
ans.push(matrix[j][r]);
}
if(l<r&&t<b){
for(let i=r-1;i>=l+1;i--){
ans.push(matrix[b][i]);
}
for(let j=b;j>=t+1;j--){
ans.push(matrix[j][l]);
}
}
[t,l,r,b]=[t+1,l+1,r-1,b-1];
}
return ans;
};
3.顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵-简单
同54. 螺旋矩阵
注意,该题中的const m=matrix.length,n=matrix[0].length;
m与n的范围可取到0
加上👇
if(matrix.length==0||matrix[0].length==0) return [];
总结数组👇