54. 螺旋矩陣
給定一個(gè)包含 m x n 個(gè)元素的矩陣(m 行, n 列)唆涝,請(qǐng)按照順時(shí)針螺旋順序唇辨,返回矩陣中的所有元素赏枚。
示例 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]
代碼,第一版:
func spiralOrder(matrix [][]int) []int {
var ret []int
lenR:=len(matrix)
if lenR==0{
return []int{}
}
lenC:=len(matrix[0])
r:=0 //row
c:=0 //column
d:=0//遍歷方向
circle:=0//第幾圈
for l:=0;l<lenR*lenC;l++{ //關(guān)鍵點(diǎn)一:循環(huán)終止條件
ret = append(ret,matrix[r][c])//關(guān)鍵點(diǎn)二:保證每次循環(huán)都遍歷一個(gè)點(diǎn)
if d==0{//向右
if c+1<lenC-circle {//關(guān)鍵點(diǎn)三:確認(rèn)方向轉(zhuǎn)換的邊界
c++
} else {
r++
d=1
}
} else if d==1 { //向下
if r+1<lenR-circle {
r++
} else {
c--
d=2
}
} else if d==2 {//向左
if c-1>= circle {
c--
} else {
r--
d=3
}
} else { //向上
if r-1>circle {
r--
} else {
c++
d=0
circle++
}
}
}
return ret
}
簡(jiǎn)化版代碼:
func spiralOrder(matrix [][]int) []int {
var ret []int
lenR:=len(matrix)
if lenR==0{
return []int{}
}
lenC:=len(matrix[0])
c:=0
r:=0
dc:=1//c的自增量
dr:=0//r的自增量
d:=0
circle:=0
for l:=0;l<lenR*lenC;l++{
ret = append(ret,matrix[r][c])
if (d%4==0&&c+1>=lenC-circle) || (d%4==1&&r+1>=lenR-circle) || (d%4==2&&c-1<circle) ||(d%4==3&&r-1<=circle){
dr,dc=dc,-dr
if d%4==3&&r-1<=circle {
circle++
}
d++
}
r+=dr
c+=dc
}
return ret
}
原理:
方向 | dr | dc |
---|---|---|
左 | 0 | 1 |
下 | 1 | 0 |
右 | 0 | -1 |
上 | -1 | 0 |
所以可以用表達(dá)式dr,dc=dc,-dr覆蓋上面的情況
總結(jié)
寫(xiě)代碼時(shí)鞍帝,要注意使用更優(yōu)雅的方法減少if。