给定一个包含 m x n 个元素的矩阵( m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
这个题目很简单,上下左右分别用四个变量去标志: 上:top 下:bottom 左:left 右: right
就按照四步走就可以:
每一步走完要对边界做出调整,具体看代码吧,清晰易懂。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<Integer>();
if (matrix.length == 0 || matrix[0].length == 0) return res;
int top = 0;
int bottom = matrix.length - 1;
int left = 0;
int right = matrix[0].length - 1;
while (true) {
for (int i = left; i <= right; i++) res.add(matrix[top][i]);
top++;
if (left > right || top > bottom) break;
for (int i = top; i <= bottom; i++) res.add(matrix[i][right]);
right--;
if (left > right || top > bottom) break;
for (int i = right; i >= left; i--) res.add(matrix[bottom][i]);
bottom--;
if (left > right || top > bottom) break;
for (int i = bottom; i >= top; i--) res.add(matrix[i][left]);
left++;
if (left > right || top > bottom) break;
}
return res;
}
}
2
CEBBCAT 2018-08-26 01:14:04 +08:00 via Android
两个问题:
1. 为什么不换行?这样对后续阅读和维护有什么好处吗?比如:`if (left > right || top > bottom) break;` 2. res 数组为什么不事先划定大小?这样可以加快很多的吧 |
3
RqPS6rhmP3Nyn3Tm 2018-08-26 02:40:00 +08:00 via iPhone
这道题不难。用一个 rounds 记录转了几圈就可以了。
|
5
laxenade 2018-08-26 08:00:51 +08:00 via Android
剧透: 正确的做法是竖着 flip 一次然后横着 flip 一次
|
6
SorcererXW 2018-08-26 08:32:29 +08:00
如果用类似 dfs 搜索的方式思考的话, 可能会优雅一点(程序效率可能会低一点
初始向右方前进 如果当前方向可行, 就继续前进 如果不行了, 就切换到下一个方向 右的下一个方向是下, 下的下一个是左, 左的下一个是上, 上的下一个是右 |
7
k9ox 2018-08-26 08:40:24 +08:00 via Android
这题不难啊,讨论个屁啊😯我记得有一题是数独的解,难到爆炸,而且讨论区有李显龙的解法🤣🤣
|
8
msg7086 2018-08-26 09:11:29 +08:00 1
def spiral_order m
return [] if m.size == 0 m.shift + spiral_order(m.transpose.reverse) end 之前看到过的写得最简洁的 Ruby 解法。 |
9
ayyll 2018-08-26 09:35:01 +08:00 via Android
打 cf 吧 半夜被 hack 到哭(逃
|
10
a554340466 2018-08-26 12:17:00 +08:00 via iPhone
这不就是 剑指 offer 前面章节讲的吗
|
11
LadyChunsKite 2018-08-26 19:20:47 +08:00 1
楼主该不会准备把这样的贴子发 800 多个吧?
|
13
Acceml OP @LadyChunsKite 是的。
|
14
Acceml OP @a554340466 嗯嗯,就是简单的找规律的题呗。
|
17
Acceml OP @msg7086 没写过 ruby,这个有顺序的 special order dfs 很屌的感觉,但是代码看起来不会很简洁?
|
18
Acceml OP @ayyll 其实工作的技术能力并不等于 leetcode 算法能力,只是过段时间要准备跳槽,所以发在公众号上和大家交流一下。不然真他妈的坚持不下去啊。
|
21
snxq1995 2018-08-26 23:28:43 +08:00 1
开个群比较好交流,这样的公众号其他人参与度不高。
|
22
ayyll 2018-08-27 07:53:58 +08:00 via Android
@Acceml leetcode 太水了 真谈算法能力 还是上 tc/cf 吧 打到 rank 前 10 标准的青年计算机科学家
|
25
Acceml OP @ayyll 我的初衷就是为了准备下面试,我认为算法能力和工程能力完全不等价。不会花很多时间在上面,你所谓的水在我看来足够即可。
|
26
Elephant696 2018-08-27 09:58:19 +08:00
这个题,,,以前面试的时候二面面试官叫我用笔手写这个算法,,,我当时告诉他说我只能说思路,手写写不出来,然后被对方请出去了,没错,是请出去了。记忆深刻。
PS:我面试是前端。。。 |
27
coffeSlider 2018-08-27 11:36:32 +08:00 via Android
这个题只用一个变量就能解呢
|
28
Acceml OP @Elephant696 哪家面试官,这么虎的吗?
|
29
Acceml OP @coffeSlider 用一个变量,需要记住走的步数?
|
30
coffeSlider 2018-08-27 13:55:51 +08:00 via Android
@Acceml 简单的来说,就是用一个数来记录四个方向和走了几圈
|
32
Elephant696 2018-08-28 16:20:18 +08:00 via iPhone
@Acceml 一个创业公司,名字就不说了。太菜了不敢大声说话
|