Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例2
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
题解:
思路:
循环大数组
如果是偶数行,将大数组的第一个小数组,以及其余小数组的最后一个数放进需返回的数组中
如果是奇数行,将大数组的最后一个小数组,以及其余小数组的第一个数放进需返回的数组中
取出数之后就把已取过的数移除,直到最后所有的数据组装完成(即所有的数组都为空)
再通熟易懂一点的就是看下面的图:一直执行红色的线就可以了
一直循环以上两步即可
| inedx | 方向 | matrix | result |
|---|---|---|---|
| 0 | right | [[2,3,4],[5,6,7],[8,9,10],[11,12,13],[14,15,16]] | [2,3,4,7,10,13,16] |
| 1 | left | [[5,6],[8,9],[11,12],[14,15]] | [2,3,4,7,10,13,16,15,14,11,8,5] |
| 2 | right | [[6],[9],[12]] | [2,3,4,7,10,13,16,15,14,11,8,5,6,9,12] |
| 3 | left | [[],[],[]] |
需要注意的点
在循环中,各数组的(最大的数组、里面的小数组)的长度都是在变化的
具体代码实现:
spiralOrder(data){
const result = [];
for(let i=0;i<data.length;i++){
if(i%2 === 0 && data[0].length>0){
// 先取大数组的第一个数组
result.push(...data[0])
// 将大数组的第一个数组移除
data.shift();
// 取剩下数组的最后一个数;这里需要重新计算数组长度
for(let j=0;j<data.length;j++){
result.push(data[j][data[j].length - 1]);
data[j].pop()
}
}else if(i%2 === 1 && data[data.length - 1].length>0){
// 先取大数组的最后一个数组
result.push(...data[data.length - 1].reverse());
data.pop();
// 取小数组的第一个
for(let j=data.length - 1;j>0;j--){
result.push(data[j][0]);
data[j].shift()
}
}
// 如果大数组里面的小数组全部变成空则返回
if(data[i] && data[i].length === 0){
return result
}
}
return result
}
总结:
算法题的解法不唯一,多思考多尝试,然后总结规律
最后:
如果有更好的思路欢迎留言~~