1.1. 题目
1.1.1. 螺旋矩阵
给定一个包含 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]
1.1.2. 题解:
- 数组是m*n的,需要注意对应的下标是多少
- 可能为空数组
1.1.3. 思路:
- 笨方法解决 -- 顺时针挨个遍历
- 假设一圈为一层,那么层数与 m和n里的最小值有关...
- 先获取 m和n谁是最小值,然后除以二再加一就是圈数
- 假设数组下标是
arr[x][y]
- 假设例子是
{1,2,3,4}, {12,13,14,5}, {11,16,15,6}, {10,9,8,7},
- 第一圈
- 先遍历
1,2,3,4
,发现数组的x
是不变的,是0,一直变化的是y
- 再遍历
5,6,7
,这时候是从5开始的,注意不是从4
开始,注意边界范围,发现x
是一直变的,y
不变,就是子数组长度-1
- 再遍历
8,9,10
,这时候从7开始,还是要注意边界条件,发现x
是不变的,是数组的长度-1
,y
一直在变 - 最后遍历
11,12
,注意边界条件,不能再去遍历到1
,这时候x
在变,y
不变
- 先遍历
- 第二圈
- 先遍历
13,14
,层数是第二层,x
不变,是1,一直变化的是y
- 再遍历
15
,发现y不变,是 2,其实就是子数组长度-1-层数
- 再遍历
16
,发现x不变, 是 2,其实就是数组长度-1-层数
- .....
- 先遍历
- 会发现,每层遍历的下标与层数有关..
- 但是有种特殊情况,假如顺时针遍历一圈的操作是 x1,y1,x2,y2 四步是一圈的话,有可能x1有,y1为0,其实值没有了,但是x2还能满足,所以得判断,一旦这个顺序有一个不走了..说明已经遍历结束了
- 这样操作的好处就是不需要把每个是否遍历都存一遍!只需要四个固定布尔值确定一下即可!
1.1.4. 代码:
点击显示
var arr []int
x := len(matrix)
if x == 0 {
return arr
}
y := len(matrix[0])
var min int
if x <= y {
min = x
} else {
min = y
}
for l:=0;l< min>>1 + 1;l++ {
xx := x - l
yy := y - l
var x1,y1,x2,y2 bool
for i:=l;i<yy;i++ {
arr = append(arr, matrix[l][i])
x1 = true
}
if !x1 {
return arr
}
for i:=l+1;i<xx;i++ {
arr = append(arr,matrix[i][yy-1])
y1 = true
}
if !y1 {
return arr
}
for i:=yy-2;i>=l;i-- {
arr = append(arr,matrix[xx-1][i])
x2 = true
}
if !x2 {
return arr
}
for i:=xx-2;i>l;i-- {
arr = append(arr,matrix[i][l])
y2 = true
}
if !y2 {
return arr
}
}
return arr