输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
- 循环的条件是 top <= bottom && left <= right 。
- 每遍历完一条边,下一条边遍历的起点被“挤占”,所以要更新相应的边界。
- 因为要在循环过程中更新边界,所以可能出现:循环的条件在中途不再满足,即 top > bottom || left > right ,其中一对边界彼此交错了。
- 这代表此时所有项都遍历完了,如果不马上 break,就会重复遍历,造成元素重复地进入结果数组。
解决办法
- 每遍历完一条边,更新完相应的边界后,都加一句if (top > bottom || left > right) break
- 但其实发现,遍历结束要么发生在遍历完“上边”,要么发生在遍历完“右边”,只需在这两步操作之后加 if (top > bottom || left > right) break 即可,不用每一条后面都加。
var spiralOrder = function(matrix) {
if(matrix.length==0) return [];
var top=0;
var bottom=matrix.length-1;
var left=0;
var right=matrix[0].length-1;
var res=[];
while(left<=right&&top<=bottom){
for(var i=left;i<=right;i++){
res.push(matrix[top][i]);
}
top++;
if(top>bottom) break;
for(var j=top;j<=bottom;j++){
res.push(matrix[j][right]);
}
right--;
if(left>right) break;
for(var i=right;i>=left;i--){
res.push(matrix[bottom][i]);
}
bottom--;
for(var j=bottom;j>=top;j--){
res.push(matrix[j][left]);
}
left++;
}
return res;
};